功效:批量高效插入数据,较之SQL语句的方式快至少25倍以上。
适用范围:SqlBulkCopy 类只能用于向 SQL Server 表中写入数据。 但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可以加载到 DataTable 实例或使用 IDataReader 实例读取即可。
原理:Microsoft SQL Server 包含名为 bcp 的常用命令行应用程序,用于快速将大文件批量复制到 SQL Server 数据库的表或视图中。 使用 SqlBulkCopy 类可以编写提供类似功能的托管代码解决方案。
使用 SqlBulkCopy 类可以执行下列操作:
-
单次批量复制操作
-
多次批量复制操作
-
事务中的批量复制操作
注:
在使用 .NET Framework 1.1 版或更低版本时(不支持 SqlBulkCopy 类),可以使用 SqlCommand 对象执行 SQL Server Transact-SQL BULK INSERT 语句。
事例:
private static long SqlBulkCopyInsert()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
DataTable dataTable = GetTableSchema();
string passportKey;
for (int i = 0; i < count; i++)
{
passportKey = Guid.NewGuid().ToString();
DataRow dataRow = dataTable.NewRow();
dataRow[0] = passportKey;
dataTable.Rows.Add(dataRow);
}
SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString);
sqlBulkCopy.DestinationTableName = "Passport";
sqlBulkCopy.BatchSize = dataTable.Rows.Count;
SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
if (dataTable!=null && dataTable.Rows.Count!=0)
{
sqlBulkCopy.WriteToServer(dataTable);
}
sqlBulkCopy.Close();
sqlConnection.Close();
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
这是一个新建DataTable进行BulkCopy的事例,实际应用中,如果是从一个数据源得到另一个,使用数据适配器(DataAdapter)填充(Fill)的DataTable更方便一些,至少Schema就现成的了。