SQL Server SqBbulkCopy 批量数据插入

 SqlBulkCopy介绍

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

(数据源不限于 SQL Server;可以使用任何数据源,只要数据可以加载到 DataTable 实例或使用IDataReader 实例读取即可)

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

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

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

 SqlBulkCopy实现原理

通过DataTable存储数据并批量导入到数据库

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

  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-:设置SqlBulkCopy对象的列映射,将源表的列映射到目标表的列

注意事项

  • 构建的DataTable要跟数据库表完全一致,包含自增列,排除NotMapped
  • 构建DataColumn时列名要跟表一致,类型要传实际类型,不能不传或者传object

 

posted @ 2023-08-14 20:33  邵彷  阅读(887)  评论(0编辑  收藏  举报