今天主要是想着如何提高批量数据的插入速度,刚好了解到这个SqlBulkCopy方法。
SqlBulkCopy是一种将数据复制到数据库的高性能方法。SqlBulkCopy中有一个WriteToServer,
它用来从数据的源复制数据到数据的目的地。
不过SqlBulkCopy仅支持SQL Server表中批量写入数据。但是数据源不限于SQL Server,
支持各种数据源,只需要将数据源加载到DataTable实例或者是IDataReader实例读取数据
使用此类方法的步骤:
初始化数据源类型(此处我使用DataTable类型)
DataTable CopyData= new DataTable("表名");
一般是使用表中的列名作为数据源的列名
DataTable CopyData= new DataTable("TestTable");
CopyData.Columns.Add("id", typeof(Int));
CopyData.Columns.Add("Name", typeof(string));
CopyData.Columns.Add("Time", typeof(DateTime));
CopyData.Columns.Add("Content", typeof(string));
给数据填充数据
foreach (var dr in dt.Tables[0].Rows)
{
DataRow row = importDataTable.NewRow();
row["id"] = Convert.ToInt(id);
row["Name"] = RealName;//操作人
row["Time"] = DateTime.Now;//操作时间
row["Content"] = String.Join("=", dr.ItemArray);//内容
CopyData.Rows.Add(row);
}
打开数据库连接插入数据
string connectionStr = “数据库连接字符串”;
SqlConnection connection = new SqlConnection(connectionStr );
using (connection)
{
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionStr, SqlBulkCopyOptions.UseInternalTransaction))
{
try
{
sqlBulkCopy.DestinationTableName = “TestTable”;
sqlBulkCopy.BatchSize = CopyData.Rows.Count;
for (int i = 0; i < CopyData.Columns.Count; i++)
{
sqlBulkCopy.ColumnMappings.Add(CopyData.Columns[i].ColumnName, CopyData.Columns[i].ColumnName);
}
sqlBulkCopy.WriteToServer(CopyData);
return "成功";
}
catch (Exception ex)
{
return "失败," + ex;
}
}
}
这样就批量插入完毕了,执行起来速度很快。
sqlBulkCopy.DestinationTableName------->指定数据库表名
sqlBulkCopy.BatchSize--------->每一批次的行数
sqlBulkCopy.ColumnMappings.Add------->指定数据库与数据源之间的对应关系
也可参考:https://blog.youkuaiyun.com/u013741154/article/details/40860723
Freesql写法:
仓储.Orm.Insert(List).ExecuteSqlBulkCopy();