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
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:
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.
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 .
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
La classe SqlBulkCopy est la meilleure pour le serveur SQL,
Effectuer un chargement/insertion en bloc de DataTable dans une table dans un serveur SQL en C #