2012-05-24 15 views
11

ho un'applicazione di servizio Windows che riceve un flusso di dati con il seguente formatoBulk milioni di inserimento di SQL Server di registrazione

IDX|20120512|075659|00000002|3|AALI     |Astra Agro Lestari Tbk.          |0|ORDI_PREOPEN|12 |00000001550.00|00000001291.67|00001574745000|00001574745000|00500|XDS1BXO1|          |00001574745000|ݤ 
IDX|20120512|075659|00000022|3|ALMI     |Alumindo Light Metal Industry Tbk.       |0|ORDI  |33 |00000001300.00|00000001300.00|00000308000000|00000308000000|00500|--U3---2|          |00000308000000|õÄ 

Questi dati è disponibile in milioni di righe e in sequenza 00000002....00198562 e devo analizzare e inserirli secondo la sequenza in una tabella di database.

La mia domanda è, qual è il modo migliore (il più efficace) per inserire questi dati nel mio database? Ho provato a utilizzare un metodo semplice per aprire un oggetto SqlConnection, quindi generare una stringa di script di inserimento SQL e quindi eseguire lo script utilizzando l'oggetto SqlCommand, tuttavia questo metodo richiede troppo tempo.

Ho letto che posso usare Sql BULK INSERT ma deve leggere da un file di testo, è possibile che questo scenario utilizzi BULK INSERT? (Non l'ho mai usato prima).

Grazie

aggiornamento: Sono consapevole di SqlBulkCopy ma mi richiede di avere DataTable prima, questo è un bene per le prestazioni? Se possibile, desidero inserire direttamente dalla mia origine dati a SQL Server senza dover utilizzare in memoria DataTable.

+3

Cosa intendi con "inserirli secondo la sequenza"? Perché è importante quale ordine si inseriscono le righe? Sono memorizzati nell'ordine specificato in [indice cluster] (http://msdn.microsoft.com/en-us/library/aa933131.aspx), indipendentemente dall'ordine di inserimento. –

risposta

22

Se si sta scrivendo questo in C# si potrebbe voler guardare la classe SqlBulkCopy.

Consente di caricare in modo efficiente una tabella di SQL Server con dati di un'altra origine.

+2

;) Sorprendente il modo in cui le persone non dovrebbero mai guardare la documentazione - SqlBUlkCopy si presenta come una sorta di controllo. Nota: è semplice (un'ora) scrivere un convertitore che consenta a SqlBulkCopy di utilizzare un'enumerazione di oggetti come origine dati;) – TomTom

+0

Ciao Mark, grazie per la risposta, ho aggiornato la mia domanda. Puoi commentare per favore? Grazie. – Arief

+2

Vedere il commento di @ TomTom. – zmbq

0

È possibile utilizzare SSIS "SQL Server Integration Service" per convertire i dati dal flusso di dati di origine al flusso di dati di distinzione. L'origine può essere il file di testo e la destinazione può essere il file di tabella di SQL Server. e Converti Execute In Bulk Insert Mode.

+0

Perché ogni parola è maiuscola ?! – Liam

3

In primo luogo, scaricare gratis LumenWorks.Framework.IO.Csv libreria.

In secondo luogo, utilizzare il codice come questo

StreamReader sr = new TextReader(yourStream); 
var sbc = new SqlBulkCopy(connectionString); 
sbc.WriteToServer(new LumenWorks.Framework.IO.Csv.CsvReader(sr)); 

Sì, è davvero così facile.

+1

Cercavo una libreria che gestisse i campi CSV con virgolette e righe nuove incorporate. Questo CSVReader è perfetto e si inserisce facilmente in SqlBulkCopy. Ora posso caricare milioni di righe al minuto utilizzando solo poche righe di codice. Grazie per la condivisione. – Martin

+0

Salve, Come inserire valori con controllo? per esempio. Voglio verificare se il record esiste o no nel db, se esiste voglio aggiungerlo ad un'altra tabella –

+1

@NitinSawant Non sarà più * bulk * inserire altro. Ma un normale uno per uno. –

Problemi correlati