sql server sqlbulkcopy 批量数据插入数据库

发布时间 2023-08-14 20:40:54作者: 邵彷

 SqlBulkCopyOptions介绍

 SqlBulkCopy位于位于命名空间System.Data.SqlClient下,主要功能是把其他数据源(数据行DataRow,数据表DataTable,数据读取器IDataReader等)的数据有效批量的导入到SQL Server表中的功能。

类似与 Microsoft SQL Server 包中名为 bcp 的命令行应用程序。

但是使用 SqlBulkCopy 类可以编写托管代码解决方案,性能上优于bcp命令行应用程序,更优于如Insert方式向SQL Server数据库插入大量数据。( SqlBulkCopy 相较于 Insert 语句而言有20~40倍性能提升)

因此SqlBulkCopy在应用到大批量数据的插入时很方便。

SqlBulkCopyOptions配置选项的说明与分析:

  1. Default 对所有选项使用默认值。
  2. KeepIdentity 保留源标识值。如果未指定,则由目标分配标识值。
  3. CheckConstraints 请在插入数据的同时检查约束。默认情况下,不检查约束。
  4. TableLock 在批量复制操作期间获取批量更新锁。如果未指定,则使用行锁。
  5. KeepNulls 保留目标表中的空值,而不管默认值的设置如何。如果未指定,则空值将由默认值替换
  6. FireTriggers 指定后,会导致服务器为插入到数据库中的行激发插入触发器。 默认情况下, 是不激发触发器的……
  7. UseInternalTransaction 如果已指定,则每一批批量复制操作将在事务中发生。 在一个事务中执行,要么都成功,要么都不成功

实现代码:

public static bool ExecuteSqlTranBulkCopy(DataTable TableName) 
{
   using(SqlConnection conn = new SqlConnection("数据库连接地址")) {
    conn.Open();
    var copy = new SqlBulkCopy(conn, SqlBulkCopyOptions.KeepIdentity, trans);
    try 
	{ 
        copy.DestinationTableName = TableName; //对应的表名
        copy.BatchSize = TableName.Rows.Count; //对应的行数
        foreach(DataColumn item in TableName.Columns) //循环所需的列名
        {
          copy.ColumnMappings.Add(item.ColumnName, item.ColumnName);
        }
        copy.BulkCopyTimeout = 12000;
        copy.WriteToServer(TableName);
    } 
	catch (Exception ex) 
	{
        throw new Exception(TableName + "---" + ex);
    } 
	finally
	{
        copy.Close();
    }
}

备注: 

sqlBulkCopy.DestinationTableName:>指定数据库表名
sqlBulkCopy.BatchSize-:指定数据库表的列数
sqlBulkCopy.ColumnMappings.Add-:指定数据库与数据源之间的对应关系