从C# DataTable 批量插入的最佳方法

30

我有一个DataTable,想要将其推送到数据库。我希望能够像这样说:

myDataTable.update();

但在阅读了 MSDN 文档之后,显然这是逐行插入的。

需要注意的是,这些语句不是批处理执行的,每行都是单独更新的。

我有什么替代方案吗?

编辑:我正在使用 SQL Server 2005


你的选项取决于你使用的服务器。 - Yetti
5个回答

62

如果使用SQL Server, 可以使用SqlBulkCopy.WriteToServer(DataTable)方法

或者在SQL Server中,您可以将其写入 .csv 文件并使用BULK INSERT

如果使用MySQL, 您可以将其写入 .csv 文件并使用LOAD DATA INFILE命令

如果使用Oracle, 您可以使用 ODP.NET 的数组绑定功能

如果使用SQLite:


ODP.NET解决方案的链接已经失效。 - Stealth Rabbi
约翰B说的很棒,这里有一个带解释的不错示例。 http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial/ - user3328730

11
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);
    }
}
请注意,数据库表的结构和表名应该相同,否则会抛出异常。

3
例如:+1。与其说“结构应该相同”,不如在示例中包含 SqlBulkCopy.ColumnMappings。 - Mike M

4
这将在很大程度上取决于您使用的关系型数据库管理系统以及该RDBMS是否存在.NET选项。
如果使用SQL Server,请使用SqlBulkCopy类。
对于其他数据库供应商,请尝试具体搜索。例如,搜索“ .NET批量插入Oracle”会产生一些有趣的结果,包括返回Stack Overflow的此链接:Bulk Insert to Oracle using .NET

3

以下是使用DataTable的方法。这是一段可以正常工作的测试代码。

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

5
为什么要转换为DataRow[]?SqlBulkCopy可以将DataTable本身作为参数,所以这似乎是一个无意义的步骤。 - SeeMoreGain

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接