SqlBulkCopy(批量复制)使用方法
用法
1、将数据库中的表复制到另一个数据库中的表。
本例将Pubs数据库的stores表中的资料复制到Northwind数据库的store表中。这两个表结构相同。
/// <summary> /// 数据库中的表复制到另一个数据库中的表 /// </summary> private void SqlBulkCopyMethod() { try { SqlConnection connetionPub = new SqlConnection(ConfigurationManager.ConnectionStrings["PubsDB"].ConnectionString); using (connetionPub) { SqlCommand commandPub = connetionPub.CreateCommand(); using (commandPub) { commandPub.CommandText = "select * from stores"; commandPub.CommandType = System.Data.CommandType.Text; connetionPub.Open();
SqlConnection connectionBulkCopy = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindDB"].ConnectionString); using (connectionBulkCopy) { connectionBulkCopy.Open(); SqlDataReader dataReader = commandPub.ExecuteReader(); SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionBulkCopy); using (bulkCopy) { bulkCopy.DestinationTableName = "store"; bulkCopy.WriteToServer(dataReader); } } } }
} catch (Exception ex) { throw ex; } }
2、将DataTable中的资料批量插入到数据库中。
在博客园中看到下边文章挺有用处,此处摘过来。原文:http://www.cnblogs.com/stalwart/archive/2011/01/07/1930207.html
1、从一个表 复制数据到另一个表
/// <summary> /// 从一个表复制到别一个表 /// </summary> private void PerformBulkCopy() { string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connection=true";
// 源 using (SqlConnection sourceConnection = new SqlConnection(connectionString)) { SqlCommand myCommand = new SqlCommand("SELECT * FROM Products_Archive", sourceConnection); sourceConnection.Open(); SqlDataReader reader = myCommand.ExecuteReader();
// 目的 using (SqlConnection destinationConnection = new SqlConnection(connectionString)) { // 打开连接 destinationConnection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString)) { bulkCopy.BatchSize = 500; bulkCopy.NotifyAfter = 1000; bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied); bulkCopy.DestinationTableName = "Products_Latest"; bulkCopy.WriteToServer(reader); } } reader.Close(); } }
public void bulkCopy_SqlRowsCopied(object obj, SqlRowsCopiedEventArgs e) { //执行事件处理方法 }
首先,我使用DataReader来从数据库的表中读取数据。 Products_Latest是目的表,因为数据要从Products_Archive表复制到Products_Latest表。 bulkCopy对象提供了一个SqlRowCopied事件,在每次处理完NotifyAfter属性指定的行数时发生。 本例中的意思就是每处理完1000行就触发一次该事件,因为NotifyAfter被设置成了1000。 BatchSize属性是非常重要的,程序性能如何主要就依靠着它。 BatchSize的意思就是同每一批次中的行数,在每一批次结束时,就将该批次中的行发送到数据库。 我将BatchSize设置成了500,其意思就是reader每读出500行就将他们发送到数据库从而执行批量复制的操作。 BatchSize的默认值是“1”,其意思就是把每一行作为一个批次发送到数据库。设置不同的BatchSize在性能上将给你带来不同的结果。 你应该根据你的需求进行测试,来决定BatchSize的大小。
// 目的 using (SqlConnection destinationConnection = new SqlConnection(connectionString)) { // 打开连接 destinationConnection.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString)) { bulkCopy.ColumnMappings.Add("ProductID", "ProductID"); bulkCopy.ColumnMappings.Add("ProductName", "Name"); bulkCopy.ColumnMappings.Add("QuantityPerUnit", "Quantity"); bulkCopy.DestinationTableName = "Products_TopSelling"; bulkCopy.WriteToServer(reader); } } reader.Close(); } }
DataSet ds = new DataSet(); DataTable sourceData = new DataTable(); ds.ReadXml(@"C:Products.xml"); sourceData = ds.Tables[0]; // 目的 using (SqlConnection destinationConnection = new SqlConnection(connectionString)) { // 打开连接 destinationConnection.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString)) { // 列映射 bulkCopy.ColumnMappings.Add("productID", "ProductID"); bulkCopy.ColumnMappings.Add("productName", "Name");
bulkCopy.DestinationTableName = "Products_TopSelling"; bulkCopy.WriteToServer(sourceData); } } }
public void SqlBulkCopyData(DataTable dataTable)
{
// SQL 数据连接 SqlConnection sqlConnection = null;
// 打开数据库 this.Open();
// 获取连接 sqlConnection = (SqlConnection)GetDbConnection();
using (SqlTransaction tran = sqlConnection.BeginTransaction())
{
// 批量保存数据,只能用于Sql
SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.Default, tran);
// 设置源表名称
sqlbulkCopy.DestinationTableName = dataTable.TableName;
// 设置超时限制
sqlbulkCopy.BulkCopyTimeout = 1000;
//如果當前表列名和數據庫列名一模一樣,可以不用寫foreach語句
foreach (DataColumn dtColumn in dataTable.Columns)
{
sqlbulkCopy.ColumnMappings.Add(dtColumn.ColumnName, dtColumn.ColumnName);
}
try
{
// 写入
sqlbulkCopy.WriteToServer(dataTable);
// 提交事务
tran.Commit();
}
catch
{
tran.Rollback();
sqlbulkCopy.Close();
}
finally
{
sqlbulkCopy.Close();
this.Close();
}
}
}