2009-06-12 12 views
9

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

9

Due motivi mi viene in mente:

  1. Per quanto ne so, è disponibile solo per Microsoft SQL Server
  2. In molti carichi di lavoro normali, non si fa massa insert s, ma occasionali insert s mescolati con select se update s. Gli stessi Microsoft affermano che un normale insert è più efficiente per questo, su SqlBulkCopy 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.

+0

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. –

+0

Perché 'SqlBulkCopyOptions.CheckConstraints' è falso per impostazione predefinita? - È così contro-intuitivo! –

+3

@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 ... :) –

13

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.

+2

+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

+1

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 –

Problemi correlati