2009-11-09 8 views
9

Possiedo un datatable con i record. Sto inserendo i record nella tabella Sql utilizzando SqlBulkCopy. Funziona bene. La prossima volta quando si ottengono i dati con gli stessi record con pochi valori modificati SqlBulkCopy sta inserendo un altro set di record senza aggiornare i dettagli precedenti. Come posso aggiornare la tabella Sql utilizzando SqlBulkCopy ?? Per favore aiuto.Utilizzo di SQLBulkCopy per inserire/aggiornare il database

Grazie, Vix

risposta

15

SqlBulkCopy viene utilizzato solo per inserimento di record, non aggiornare come spiegato here. Dovresti utilizzare una tecnica diversa per eseguire aggiornamenti collettivi.

ad es. è possibile eseguire SqlBulkCopy in una tabella di gestione temporanea, quindi eseguire alcuni SQL per aggiornare da lì alla tabella principale.

+0

+1 per la tabella di staging, è esattamente come è necessario eseguire gli aggiornamenti con l'inserimento di massa e per enormi quantità di aggiornamenti sulle stesse tabelle, vale la pena farlo. –

3

Tronca la tabella ed esegui Bulkcopy.

+0

per vix: Tronca quindi il caricamento di massa è il processo più efficiente se si desidera che la tabella risultante contenga solo i record di caricamento di massa. - upvoted – Chad

+0

Bene per alcune situazioni semplici, ma questo sarebbe un vero dolore se qualsiasi livello di complessità nei dati che si stanno aggiornando. Mantenere l'integrità dei dati potrebbe essere molto difficile a seconda dei dettagli dell'app/DB. per esempio. Le relazioni FK devono essere mantenute. – MemeDeveloper

2

Evitare la tabella troncata e creare una nuova tabella temporanea, che consuma più spazio e memoria.

Ho creato un trigger con INSTEAD OF INSERT e utilizzo all'interno dell'istruzione MERGE.

Ma non dimenticare di aggiungere il parametro SqlBulkCopyOptions.FireTriggers in SqlBulkCopy.

Questo è il mio due centesimi.

-1

Come menzionato da AdaTheDev, SqlBulkCopy può solo inserire tuttavia c'è una libreria alternativa che consente di eseguire operazioni Upsert.

Diniego: Sono il proprietario del progetto Bulk Operations

La biblioteca operazioni di massa ha un metodo "BulkMerge" che inserire o aggiornare righe in base alla chiave specificata.

var bulk = new BulkOperation(connection); 

bulk.ColumnMappings.Add("ID", true); 
bulk.ColumnMappings.Add("Column1"); 
bulk.ColumnMappings.Add("Column2"); 
bulk.ColumnMappings.Add("Column3"); 

bulk.BulkMerge(dt); 
Problemi correlati