web-dev-qa-db-fra.com

Meilleure façon d'insérer en bloc à partir d'un DataTable C #

J'ai un DataTable que je veux pousser à la base de données. Je veux pouvoir dire comme 

myDataTable.update();

Mais après avoir lu le fichier MSDN -docs , cela insère apparemment ligne par ligne. 

Il convient de noter que ces instructions ne sont pas exécutées par lots; chaque ligne est mise à jour individuellement.

Quelles sont mes alternatives?

Edit: J'utilise SQL Server 2005

20
Joda Maki

Si vous utilisez SQL Server, SqlBulkCopy.WriteToServer(DataTable)

Ou aussi avec SQL Server, vous pouvez l'écrire dans un fichier .csv et utiliser BULK INSERT

Si vous utilisez MySQL, vous pouvez l'écrire dans un fichier .csv et utiliser LOAD DATA INFILE

Si vous utilisez Oracle, vous pouvez utiliser la fonctionnalité de liaison de tableau de ODP.NET

Si SQLite:

45
JohnB
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);
    }
}

Veuillez noter que la structure de la table de base de données et le nom de la table doivent être identiques, sinon une exception sera levée.

7
Vishal Kotak

Cela dépendra en grande partie du SGBDR que vous utilisez et de l'existence éventuelle d'une option .NET pour ce SGBDR.

Si vous utilisez SQL Server, utilisez la classe SqlBulkCopy .

Pour les autres fournisseurs de bases de données, essayez de les rechercher spécifiquement sur Google. Par exemple, une recherche sur ".NET Bulk insert in Oracle" a donné des résultats intéressants, y compris ce lien vers Stack Overflow: Bulk Insert to Oracle à l'aide de .NET .

4
David

Voici comment je le fais en utilisant un DataTable. Ceci est une pièce de travail du code TEST.

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
3
Carlos A Merighe
0
Bala