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);
             }
         }
     }
 }

 

posted on 2025-08-11 17:16  一只小小的程序猿  阅读(30)  评论(0)    收藏  举报