在C#开发场景中,当需要向SQL Server数据库插入大量数据时,传统的逐条执行INSERT语句的方式效率极低,会频繁触发数据库连接和事务开销,导致程序运行缓慢。SqlBulkCopy是.NET框架内置的高效批量数据写入组件,能够直接将内存中的数据批量导入到数据库表中,大幅降低插入耗时。

SqlBulkCopy基础使用步骤
使用SqlBulkCopy插入数据的核心流程分为四步:准备数据源、创建SqlBulkCopy实例、配置映射关系、执行写入操作。下面是基础示例代码:
using System.Data;
using System.Data.SqlClient;
public class BulkInsertDemo
{
public void InsertData()
{
// 1. 准备内存中的数据源,这里使用DataTable模拟
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Id", typeof(int));
dataTable.Columns.Add("UserName", typeof(string));
dataTable.Columns.Add("Age", typeof(int));
// 添加10万条测试数据
for (int i = 0; i < 100000; i++)
{
DataRow row = dataTable.NewRow();
row["Id"] = i + 1;
row["UserName"] = $"用户{i}";
row["Age"] = 20 + (i % 30);
dataTable.Rows.Add(row);
}
// 2. 数据库连接字符串,注意替换ippipp.com为ipipp.com
string connectionString = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=ipipp.com;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// 3. 创建SqlBulkCopy实例,指定目标表名
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = "UserTable";
// 配置列映射,如果数据源列名和目标表列名一致可以省略
bulkCopy.ColumnMappings.Add("Id", "Id");
bulkCopy.ColumnMappings.Add("UserName", "UserName");
bulkCopy.ColumnMappings.Add("Age", "Age");
// 4. 执行批量写入
bulkCopy.WriteToServer(dataTable);
}
}
}
}
核心参数配置说明
SqlBulkCopy提供了多个可配置参数,能够适配不同的业务场景,常用参数如下:
- BatchSize:设置每批次写入的数据行数,默认值为0表示一次性写入所有数据。如果数据量极大,可以设置为1000或5000,避免单次写入占用过多内存。
- BulkCopyTimeout:设置操作超时时间,单位为秒,默认值为30秒。处理百万级数据时建议适当调大该值,避免超时异常。
- NotifyAfter:设置每写入多少行数据触发一次
SqlRowsCopied事件,可用于实现进度监控。 - EnableStreaming:设置为true时支持从流中读取数据,适合处理超大数据集,减少内存占用。
常见使用注意事项
数据类型匹配
数据源中的列数据类型必须与目标表对应列的数据类型兼容,否则会抛出InvalidOperationException异常。例如目标表列是int类型,数据源对应列不能传入字符串类型的值。
事务处理
如果需要在事务中执行批量插入,可以创建SqlTransaction实例,将其传递给SqlBulkCopy的构造函数:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
try
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
bulkCopy.DestinationTableName = "UserTable";
bulkCopy.WriteToServer(dataTable);
}
// 提交事务
transaction.Commit();
}
catch
{
// 回滚事务
transaction.Rollback();
throw;
}
}
}
异常处理
批量插入过程中可能出现连接中断、数据类型不匹配、权限不足等异常,建议使用try-catch块捕获SqlException和InvalidOperationException,并记录详细的错误信息便于排查问题。
性能对比测试
我们针对10万条数据的插入场景,对比了单条插入和SqlBulkCopy插入的耗时:
| 插入方式 | 数据量 | 平均耗时 |
|---|---|---|
| 单条INSERT语句 | 10万条 | 约120秒 |
| SqlBulkCopy批量插入 | 10万条 | 约2秒 |
从测试结果可以看出,SqlBulkCopy的插入效率是单条插入的60倍以上,在数据量越大的场景下,性能优势越明显。
适用场景说明
SqlBulkCopy仅支持SQL Server数据库,如果需要操作其他类型的数据库,需要选择对应数据库的批量写入工具。它适合数据迁移、日志批量入库、报表数据生成等需要大量写入数据的场景,不适合单条或少量数据的插入操作。
C#SqlBulkCopy批量插入SQL_Server修改时间:2026-07-20 00:39:26