SqlBulkCopy实现十万级数据高效插入sql server数据库
最近遇到10万条数据批量插入数据库耗时过长的问题,最开始用的foreach单条插入耗时约30分钟,经优化改用SqlBulkCopy批量操作,性能提升至仅需19秒完成,以下是优化后的代码。
private void BulkInsertClinicItems(IList<ModelInfo> listDiagnosis, string connectionString)
{
// 创建内存表结构
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("User", typeof(string));
dataTable.Columns.Add("CreatedDate", typeof(DateTime));
// 填充数据(并行处理)
foreach (var item in listDiagnosis)
{
DataRow row = dataTable.NewRow();
row["Name"] = item.V<string>("Name");
row["User"] = item.V<string>("User");
row["CreatedDate"] = DateTime.Now;
dataTable.Rows.Add(row);
}
// 批量插入(带事务)
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
bulkCopy.DestinationTableName = "ClinicItems";
bulkCopy.BatchSize = 5000;//限制单次插入数量
bulkCopy.ColumnMappings.Add("Name", "Name");
bulkCopy.ColumnMappings.Add("User", "User");
bulkCopy.ColumnMappings.Add("CreatedDate", "CreatedDate");
try
{
bulkCopy.WriteToServer(dataTable);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw new Exception("批量插入失败: " + ex.Message);
}
}
}
}
浙公网安备 33010602011771号