Ho fatto qualche ricerca per "Il modo più semplice di inserire enormi dati in DB con C#", quindi molte persone mi hanno suggerito di usare SqlBulkCopy. Dopo averlo provato, mi ha davvero stupito. Indubbiamente, SqlBulkCopy è molto molto veloce. Sembra che SqlBulkCopy sia un modo perfetto per inserire dati (in particolare dati enormi). Ma perché non lo usiamo in ogni momento. C'è qualche inconveniente nell'usare SqlBulkCopy?Qual è lo svantaggio di SqlBulkCopy
risposta
Due motivi mi viene in mente:
- Per quanto ne so, è disponibile solo per Microsoft SQL Server
- In molti carichi di lavoro normali, non si fa massa
insert
s, ma occasionaliinsert
s mescolati conselect
seupdate
s. Gli stessi Microsoft affermano che un normaleinsert
è più efficiente per questo, suSqlBulkCopy
MSDN page.
Si noti che se si desidera un SqlBulkCopy
equivalente a un inserto normale, per lo meno si dovrà passare il parametro SqlBulkCopyOptions.CheckConstraints
.
SqlBulkCopy esiste anche per Oracle v11, ma è fornito dagli assembly Oracle .NET che si ottengono quando si installa Oracle Client. La classe SqlBulkCopy viene sostanzialmente implementata una per una dal provider del motore di database di destinazione.
Un ENORME svantaggio, tuttavia, non è assolutamente necessario segnalare errori. Se, ad esempio, hai aggiornato i dati in un DataSet, lo stai svuotando al DB con un adattatore, e c'è una violazione della chiave (o qualsiasi altro errore), il colpevole DataRows avrà .HasErrors impostato su true, e tu puoi aggiungilo al messaggio di eccezione quando viene generato.
Con SqlBulkCopy, ottieni il tipo di errore e il gioco è fatto. Buona fortuna debugging.
+1 Completamente d'accordo che il debugging è un problema con BulkCopy. Un approccio che ho è quello di "decostruire" i comandi BulkCopy falliti e inserirli riga per riga in un blocco finally. In questo modo posso individuare il DataRow incriminato come parte della segnalazione degli errori. – Totero
Ho capito che per la segnalazione degli errori c'è un modo per recuperare i singoli errori, ma è necessario reinviare la copia di massa nelle pagine di un record e poi prendere e lanciare tutte le eccezioni (insieme alle righe colpevoli). Non è il più efficiente, ma succede solo quando si verifica un errore, quindi non è male. Vedi qui per l'articolo completo: http://www.codeproject.com/Articles/387465/Retrieving-failed-records-after-an-SqlBulkCopy-exc –
- 1. Qual è lo svantaggio della LDA per i testi brevi?
- 2. Qual è lo svantaggio di usare le edizioni di Visual Studio Express?
- 3. Qual è lo svantaggio di usare semplicemente Redis invece di un RDBMS?
- 4. Qual è lo svantaggio di utilizzare il server Fastgigi di Django
- 5. Qual è lo svantaggio dell'uso del preprocessore per definire una chiamata di funzione?
- 6. Perché Rust ha rimosso il modello di threading verde; qual è lo svantaggio?
- 7. Qual è lo svantaggio dell'uso di websocket/socket.io dove andrà ajax?
- 8. Qual è lo svantaggio della sostituzione di size_t con unsigned long
- 9. Qual è lo scopo di. * \\?
- 10. Perché abbiamo bisogno di API Web in MVC? Qual è lo svantaggio di un'ape riposante in mvc?
- 11. Inserimento di GUID con SqlBulkCopy
- 12. È possibile utilizzare System.Transactions.TransactionScope con SqlBulkCopy?
- 13. Svantaggio della coda circolare?
- 14. Qual è lo stack USB?
- 15. Svantaggio delle uova Python?
- 16. vantaggio/svantaggio MemoryStream.Position o MemoryStream.Seek
- 17. Qual è lo stile di codifica migliore?
- 18. Qual è lo stato corrente di PocoCapsule?
- 19. Qual è lo scopo di Array.GetLowerBound (int)?
- 20. Qual è lo scopo di :: in C#?
- 21. Qual è lo scopo di IAsyncStateMachine.SetStateMachine?
- 22. Qual è lo scopo di riutilizzareIdentificatore?
- 23. Qual è lo scopo di IntentSender?
- 24. Qual è lo scopo di @EnableTransactionManagement?
- 25. Qual è lo scopo di .git/log
- 26. Qual è lo scopo di angular-sanitize?
- 27. Qual è lo scopo di com.sun.org.apache.xpath.internal.operations.String?
- 28. Qual è lo scopo di java.math.MutableBigInteger?
- 29. Qual è lo schema di progettazione "Dispatcher"?
- 30. Qual è lo scopo di $ eq
Sì, SqlBulkCopy può essere utilizzato solo con MS SQL Server. Questo è anche solo uno degli inconvenienti che conosco. A volte non è un grosso problema. Ad esempio: i nostri clienti usano solo MS SQL Server e noi costruiamo solo applicazioni per loro con diverse classi che appartengono allo spazio dei nomi System.Data.SqlClient. –
Perché 'SqlBulkCopyOptions.CheckConstraints' è falso per impostazione predefinita? - È così contro-intuitivo! –
@BarryKaye: No, non lo è. Il nome è 'Bulk Copy' quindi dovresti copiare i dati per i quali i vincoli sono già noti per essere corretti, altrimenti non sai cosa stai facendo ... :) –