在 ADO.NET 2.0 中,DataAdapter 公开了 UpdateBatchSize 属性。将 UpdateBatchSize 设置为正整数值将使对数据库的更新以指定大小的批次进行发送。例如,如果将 UpdateBatchSize 设置为 10,会将 10 个独立的语句组合在一起并作为一批提交。将 UpdateBatchSize 设置为 0 将导致 DataAdapter 使用服务器可以处理的最大批次的大小。如果将其设置为 1,则禁用批量更新,因为此时每次发送一行。
执行非常大的批次可能会降低性能。因此,在实现应用程序之前,应测试最佳的批次大小设置。
使用 UpdateBatchSize 属性
启用了批量更新后,DataAdapter 的 UpdateCommand、InsertCommand 和 DeleteCommand 的 UpdatedRowSource 属性值应设置为 None 或 OutputParameters。在执行批量更新时,命令的 FirstReturnedRecord 或 Both 的 UpdatedRowSource 属性值无效。
//dt 数据有10000笔,batchSize=5000,每次以5000笔数据更新到数据库,共分批2次更次。
Code
public static void BatchInsert(DataTable dt, int batchSize)
{
string strConn = ConfigurationManager.ConnectionStrings["DataConnectionString"].ConnectionString;
string sql = "INSERT INTO Rework " (CardNo,Customer,CardType,DataFileName,CustomerData,PageNo,CustomerId,CardDate,InsertDate)";
sql = sql + " VALUES(@CardNo,@Customer,@CardType,@DataFileName,@CustomerData,@PageNo,@CustomerId,@CardDate,@InsertDate)";
using (SqlConnection conn = new SqlConnection(strConn))
{
SqlDataAdapter da = new SqlDataAdapter();
da.InsertCommand = new SqlCommand(sql, conn);
da.InsertCommand.Parameters.Add("@CardNo", SqlDbType.NVarChar, 50, "CardNo");
da.InsertCommand.Parameters.Add("@Customer", SqlDbType.NVarChar, 50, "Customer");
da.InsertCommand.Parameters.Add("@CardType", SqlDbType.NVarChar, 50, "CardType");
da.InsertCommand.Parameters.Add("@DataFileName", SqlDbType.NVarChar, 50, "DataFileName");
da.InsertCommand.Parameters.Add("@CustomerData", SqlDbType.NVarChar, 1000, "CustomerData");
da.InsertCommand.Parameters.Add("@PageNo", SqlDbType.BigInt, 8, "PageNo");
da.InsertCommand.Parameters.Add("@CustomerId", SqlDbType.NVarChar, 20, "CustomerId");
da.InsertCommand.Parameters.Add("@CardDate", SqlDbType.NVarChar, 10, "CardDate");
da.InsertCommand.Parameters.Add("@InsertDate", SqlDbType.DateTime, 8, "InsertDate");
da.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
da.InsertCommand.CommandTimeout = 0;
da.UpdateBatchSize = batchSize;
da.Update(dt);
}
}