200.000 righe o informazioni con SQLBulkCopy c #

c# sql sqlbulkcopy

Domanda

Ho una tabella di database con 3 colonne, tutte le stringhe. Devo caricare 200.000 righe di informazioni. Posso farlo ma, come ti aspetteresti, ci vorrebbe troppo tempo, come 30 minuti.

Ora sto cercando di usare SQLBulkCopy per farlo più velocemente ma non riesco a capire come farlo correttamente. Un esempio di una riga di dati sarebbe:

"test string","test string,"test string"

Devo scrivere i miei dati su un file temporaneo in modo che SQLBulkCopy possa usarli per caricare i dati? Come ogni riga rappresenta una riga e cancella i dati con una virgola?

Ecco cosa ho finora, ogni aiuto sarebbe fantastico!

//this method gets a list of the data objects passed in

 List<string[]> listOfRows = new List<string[]>(); // holds all the rows to be bulk copied to the data table in th database

foreach (DataUnit dataUnit in dataUnitList)
{         
 string[] row = new string[2];
 row[0] = dataUnit.value1.ToString();
 row[1] = dataUnit.value2.ToString();
 row[2] = dataUnit.value3.ToString() ;
 listOfRows.Add(row);
 }

File.Create(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test200kFile.txt"));

using (System.IO.StreamWriter file = new System.IO.StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test200kFile.txt")))
             {

                 foreach(string[] array in listOfRows)
                 {
                     file.Write(array[0] + "," + array[1] + "," + array[2]);
                 }
             }

             using (MyFileDataReader reader = new MyFileDataReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test200kFile.txt")))
             {
                 SqlBulkCopy bulkCopy = new SqlBulkCopy("my connection string to database");
                 bulkCopy.DestinationTableName = "my table name";
                 bulkCopy.BatchSize = 20000; //what if its less than 200,000?

                 bulkCopy.WriteToServer(reader);

                 bulkCopy.Close();

             }  

Risposta accettata

L'inserto di massa T-SQL richiede che i dati di origine siano presenti in un file sul server DB. Non è il modo in cui vuoi andare se scrivi il codice.

Invece dovresti creare un adattatore attorno a qualsiasi fonte di dati che hai. L'adattatore dovrebbe implementare parti dell'interfaccia IDataReader : SqlBulkCopy utilizza solo alcuni metodi di IDataReader , quindi solo quelli che devono essere implementati:

Proprietà

  • FieldCount

metodi

  • GetName
  • GetOrdinal
  • GetValue
  • Leggere

(fonte: http://www.michaelbowersox.com/2011/12/22/using-a-custom-idatareader-to-stream-data-into-a-database/ )

Quindi, a meno che i tuoi dati non siano già archiviati, non è necessario scriverli su file. Assicurati di poter presentare un record alla volta attraverso l'interfaccia IDataReader .

Evitare di salvare i dati nel file consente di risparmiare molte risorse e tempo. Una volta ho implementato un processo di importazione che legge i dati XML da un'origine dati FTP tramite un XmlReader, che è stato quindi incluso in un IDataReader personalizzato. In questo modo ho potuto trasmettere i dati dal server ftp, tramite il server dell'app, al server DB senza dover scrivere l'intero set di dati sul disco sul server delle app.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché