2012-05-24 11 views
11

Tengo una aplicación de servicio de Windows que recibe un flujo de datos con el siguiente formatomillones inserción masiva de SQL Server de registro

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|õÄ 

Estos datos vienen en millones de filas y en secuencia 00000002....00198562 y tengo que analizar y insertarlos de acuerdo con la secuencia en una tabla de base de datos.

Mi pregunta es, ¿cuál es la mejor manera (la más eficaz) para insertar estos datos en mi base de datos? Intenté usar un método simple para abrir un objeto SqlConnection, luego generar una cadena de script SQL insert y luego ejecutar el script usando el objeto SqlCommand, sin embargo, este método lleva demasiado tiempo.

leí que puedo utilizar SQL BULK INSERT pero tiene que leer de un archivo de texto, es posible que este escenario de usar BULK INSERT? (Nunca lo he usado antes).

Gracias

actualización: Soy consciente de SqlBulkCopy pero me obliga a tener DataTable primera, esto es bueno para el rendimiento? Si es posible, quiero insertar directamente desde mi fuente de datos a SQL Server sin tener que usar en la memoria DataTable.

+3

¿Qué quiere decir con "insertarlos según la secuencia"? ¿Por qué importa el orden en que insertas las filas? Se almacenan en el orden especificado en el [índice agrupado] (http://msdn.microsoft.com/en-us/library/aa933131.aspx), independientemente del orden de inserción. –

Respuesta

22

Si está escribiendo esto en C# es posible que desee mirar a la clase SqlBulkCopy.

Le permite cargar de forma masiva una tabla de SQL Server con datos de otra fuente.

+2

;) Sorprendente cómo la gente supuestamente nunca mira la documentación: SqlBUlkCopy aparece para al menos comprobar. Nota: Es trivial (una hora) para escribir un convertidor que permite SqlBulkCopy utilizar una enumeración de objetos como fuente de datos;) – TomTom

+0

Hola Marcos, gracias por su respuesta, he actualizado mi pregunta. ¿Podrías comentar sobre eso por favor? Gracias. – Arief

+2

Consulte el comentario de @TomTom. – zmbq

0

Puede usar SSIS "SQL Server Integration Service" para convertir datos de flujo de datos de origen a flujo de datos de destilación. La fuente puede ser un archivo de texto y el destino puede ser un archivo de tabla de SQL Server. y Convertir ejecución en el modo de inserción masiva.

+0

¿Por qué cada palabra está en mayúscula? – Liam

3

Primero, descargue gratis biblioteca LumenWorks.Framework.IO.Csv.

En segundo lugar, utilizar el código como este

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

Sí, es así de fácil.

+1

Estaba buscando una biblioteca que haga frente a los campos CSV con comillas y saltos de línea insertados. Este CSVReader es perfecto y se conecta fácilmente a SqlBulkCopy. Ahora puedo cargar millones de filas por minuto usando solo unas pocas líneas de código. Gracias por compartir. – Martin

+0

Hola, ¿Cómo insertar valores con cheque? p.ej. Quiero comprobar si el registro existe o no en el archivo db, si existe Quiero agregar a otra tabla –

+1

@NitinSawant No va a ser * bulk * inserta más. Pero un uno por uno regular. –

Cuestiones relacionadas