C# SqlBulkCopy


使用SqlBulkCopy批量插入数据

1.使用场景

  在之前遇到的项目中,出现要使用文档导入大量的数据,普通的插入效率太低,故使用SqlBulkCopy提高导入数据效率。

2.为什么使用SqlBulkCopy

  SqlBulkCopy,微软提供的快速插入类,针对大批量数据操作,此类效果明显有所提升,以下是微软官方解释:

  Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。

  SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。

  使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。

3.使用实例
  1 public static ResponseModel BatchImportPoint(Datatable dt)
  2         {  
8
if (dt != null) 9 {
            //连接数据库
10 SqlConnection conn = context.Database.Connection as SqlConnection; 11 conn.ConnectionString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString; 12 if (conn.State != ConnectionState.Open) 13 { 14 conn.Open(); 15 } 16 using (SqlTransaction transaction = conn.BeginTransaction()) //使用事务 17 { 18 try 19 { 52 SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction) 53 { 54 DestinationTableName = "Test_Table",//要插入的表的表名 55 BatchSize = dt.Rows.Count 56 }; 57 #region 映射字段名 DataTable列名 ,数据库Test_Table对应的列名 58 59 bulkCopy.ColumnMappings.Add("ID", "ID"); 60 bulkCopy.ColumnMappings.Add("Name", "Name"); 61 bulkCopy.ColumnMappings.Add("Phone", "Phone"); 75 76 bulkCopy.WriteToServer(dt); 77 #endregion 映射字段名 DataTable列名 ,数据库Test_Table对应的列名 79 80 transaction.Commit();//事务提交 81 conn.Close(); 84 return new ResponseModel(ResponseModel.Success, "添加完成", ds.Tables[0].Rows.Count);
94
} 95 catch (Exception) 96 { 97 transaction.Rollback();//回滚 98 conn.Close(); 99 File.Delete(filePath); 101 return new ResponseModel(ResponseModel.Fail, "添加失败,请检查您的数据"); 102 } 103 } 105 else 106 { 108 return new ResponseModel(ResponseModel.Fail, "添加失败,未获取到数据"); 109 } 110 }