在做大量数据流处理时,我们经常会遇到批量插入记录的情况,下面收录一些
1. Bcp
1> 创建一个DataTable(schema应和对应的DB Table一致), 或者创建一些临时表
2>向数据表中注入我们的数据
3>按照以下办法Call Bcp
4> 完成
SqlConnection cn = new
System.Data.SqlClient.SqlBulkCopy bc = new System.Data.SqlClient.SqlBulkCopy(cn, SqlBulkCopyOptions.TableLock, null);
bc.BulkCopyTimeout = 600;
bc.BatchSize = dt.Rows.Count;
cn.Open();
bc.DestinationTableName = <db Table>;
bc.WriteToServer(dt);
cn.Close();
bc.Close();
2. XML数据类型
以XML格式插入批量记录,在SqlServer 2005开始支持XML数据类型
优点:在程序中,将批量记录作为参数一次性传送到数据库段,较之前的逐个记录的插入有很大进步
缺点:只有在记录数较少,XML结构较简单(层级较少)时,效率较高;而且,不易使用和代码维护
3. DataTable数据类型
在SqlServer 2008开始支持DataTable数据类型,这个是相对之前XML类型的进步和改善
优点:是最简单且最受推荐的作为存储过程的参数传入记录的方法
4. ADO.NET BatchUpdate()
e.g.
using (SqlTransaction sqlTrans = conn.BeginTransaction(IsolationLevel.ReadCommitted))
{
try
{
DataTable dtInsertRows -> construct the datatable with values
var cmd = conn.CreateCommand();
cmd.Transaction = sqlTrans;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_name";
cmd.UpdatedRowSource = UpdateRowSource.None;
cmd.Parameters.Add("@id", SqlDbType.UniqueIdentifier, 16, dtInsertRows.Columns["id"].ColumnName);
using (SqlDataAdapter dataAdapter = new SqlDataAdapter())
{
dataAdapter.InsertCommand = cmd;
dataAdapter.UpdateBatchSize = 100;
dataAdapter.Update(dtInsertRows);
}
}
sqlTrans.Commit();
}