¿Cómo puedo copiar el contenido de DataTable en una tabla SQL mientras lo estoy llenando?

datatable sqlbulkcopy sql-server

Pregunta

He definido un DataTable agregando columnas escritas. Espero que el DataTable oscile entre 1 millón y 3 millones de filas.

Estoy usando el TextFieldParser de Microsoft (porque admite varios formatos de ancho fijo, por ejemplo, a través de un método Peek), para rellenar las filas de la DataTable.

Me gustaría tener algún tipo de operación que copie filas del DataTable en una tabla de SQL duplicada.

Si relleno todo el DataTable y luego uso SqlAdapter y SqlCommandBuilder para actualizar la tabla SQL como se menciona aquí, me quedo sin memoria.

¿Cómo puedo lograr esto?

Respuesta aceptada

No se recomienda usar DataTable para 1 M de filas, simplemente puede crear un nuevo SqlComand para INSERT y hacer que todos los campos de la tabla sean parámetros y ejecutar este comando en el bucle.

Pero si ya ha escrito un montón de código con DataTable, puede considerarlo como un búfer y tener la siguiente solución:

1) en la medida en que lea las filas de datos, verifique cuántas ya se han leído hasta ahora

2) tan pronto como obtiene 10K filas, ejecuta DataTable.Update ();

(puedes llamar a este parámetro como un tamaño de búfer y ponerlo en alguna parte de la configuración para evitar la codificación)

3) luego limpia todos los datos en el DataTable, llamando

DataTable.Clear(); 
DataTable.AcceptChanges();

4) sigues leyendo datos de archivo, repeticiones de bucle


Además, es difícil hacer sugerencias generales sin conocer la estructura de su archivo y el propósito de la aplicación, solo respondí la pregunta de cómo evitar el "agotamiento de la memoria" cuando utilizo conjuntos de datos muy grandes. Pero también recomiendo considerar todas las opciones posibles para evitar el uso de tablas de datos .NET como almacenamiento intermedio de datos y archivos de proceso directamente con todos los medios posibles que proporciona el servidor SQL, como

1) INSERTO A GRANEL: http://msdn.microsoft.com/en-us/library/ms188365.aspx

2) utilidad bcp: http://msdn.microsoft.com/en-us/library/ms162802.aspx

3) Servicios de integración de MS SQL: http://msdn.microsoft.com/en-us/library/ms141026.aspx

Las operaciones de inserción masiva utilizando cualquiera de esos comandos y herramientas pueden iniciarse desde .NET.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué