2011-02-16 51 views
18

Tengo un DataTable que quiero enviar a la base de datos. Quiero ser capaz de decir comoLa mejor manera de insertar a granel desde una C# DataTable

myDataTable.update(); 

Pero después de leer el MSDN docs, al parecer esto insertos fila por fila.

Cabe señalar que estas declaraciones no se realizan como un proceso por lotes; cada fila se actualiza individualmente.

¿Cuáles son mis alternativas?

Editar: Estoy utilizando SQL Server 2005

+0

Sus opciones dependen del servidor que esté utilizando. – Yetti

Respuesta

43

Si utiliza SQL Server, SqlBulkCopy.WriteToServer(DataTable)

O también con SQL Server, puede escribirla en un csv y utilizar BULK INSERT

Si el uso de MySQL, se podría escribir a un csv y utilizar LOAD DATA INFILE

Si se utiliza Oracle, you can use the array binding feature of ODP.NET

Si SQLite :

+0

El enlace para la solución ODP.NET está roto. –

+0

Lo que JohnB dijo fue increíble, aquí hay una buena muestra con una explicación. http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial/ –

4

Esto va a depender en gran medida del RDBMS que está usando, y si una opción de .NET siquiera existe para que RDBMS.

Si está utilizando SQL Server, use la clase SqlBulkCopy.

Para otros proveedores de bases de datos, intente buscar en ellos específicamente. Por ejemplo, una búsqueda de ".NET Bulk insert into Oracle" arrojó algunos resultados interesantes, incluido este enlace a Stack Overflow: Bulk Insert to Oracle using .NET.

2

Así es como lo hago utilizando un DataTable. Esta es una pieza de trabajo de código de prueba.

using (SqlConnection con = new SqlConnection(connStr)) 
{ 
    con.Open(); 

    // Create a table with some rows. 
    DataTable table = MakeTable(); 

    // Get a reference to a single row in the table. 
    DataRow[] rowArray = table.Select(); 

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con)) 
    { 
     bulkCopy.DestinationTableName = "dbo.CarlosBulkTestTable"; 

     try 
     { 
      // Write the array of rows to the destination. 
      bulkCopy.WriteToServer(rowArray); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

    } 

}//using 
+4

¿Por qué se convierte a DataRow []? el SqlBulkCoopy puede tomar DataTable como un param, por lo que parece un paso inútil. – SeeMoreGain

6
string connectionString= ServerName + DatabaseName + SecurityType; 
using (SqlConnection connection = new SqlConnection(connectionString)) 
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { 
    connection.Open(); 
    bulkCopy.DestinationTableName = "TableName"; 
    try { 
     bulkCopy.WriteToServer(dataTableName); 
    } catch (Exception e) { 
     Console.Write(e.Message); 
    } 
} 

Tenga en cuenta que la estructura de la tabla de base de datos y el nombre de tabla deben ser los mismos o se producirá una excepción.

+0

nice está funcionando – user3098137

+0

+1 por ejemplo :). En lugar de decir "la estructura debería ser la misma", ¿qué le parece incluir SqlBulkCopy.ColumnMappings en el ejemplo? –

Cuestiones relacionadas