首页  ·  知识 ·  编程语言
SqlBulkCopy(批量复制)使用方法
网友     .NET  编辑:dezai   图片来源:网络
SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法。SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制
 SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法。SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地。 WriteToServer方法可以处理的数据类型有DataRow[]数组,DataTable 和 DataReader。 你可以根据不同的情形使用不同的数据类型。SqlBulkCopy其原理是采用了SQL Server的BCP协议进行数据的批量复制。

 

用法

 

1、将数据库中的表复制到另一个数据库中的表。

本例将Pubs数据库的stores表中的资料复制到Northwind数据库的store表中。这两个表结构相同。

using System.Data;
using System.Data.SqlClient;
using System.Configuration;


/// <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中的资料批量插入到数据库中。
 

using System.Data;
using System.Data.SqlClient;
using System.Configuration;
/// <summary>
/// 将表中资料批量插入到数据库
/// 转自:http://www.cnblogs.com/mrliuc/archive/2011/01/18/1938271.html
/// </summary>
/// <param name="connectionString"></param>
/// <param name="TableName"></param>
/// <param name="dt"></param>
private void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dt)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlBulkCopy sqlbulkcopy =
new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
{
try
{
sqlbulkcopy.DestinationTableName
= TableName;
for (int i = 0; i < dt.Columns.Count; i++)
{
sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
sqlbulkcopy.WriteToServer(dt);
}
catch (System.Exception ex)
{
throw ex;
}
}
}
}


 


 

在博客园中看到下边文章挺有用处,此处摘过来。原文:http://www.cnblogs.com/stalwart/archive/2011/01/07/1930207.html

1、从一个表 复制数据到另一个表

using System.Data;
using System.Data.SqlClient;
using System.Configuration;

/// <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的大小。

 

2、在不同的映射表之间复制数据
上面的例子中两个表具有相同的结构。 有时,你需要在具有不同结构的表之间复制数据。

 

/// <summary>
/// 不同表之间复制数据
/// </summary>
private static void PerformBulkCopyDifferentSchema()
{
string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connection=true";
DataTable sourceData
= new DataTable();
//
using (SqlConnection sourceConnection = new SqlConnection(connectionString))
{
SqlCommand myCommand
= new SqlCommand("SELECT TOP 5 * 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.ColumnMappings.Add(
"ProductID", "ProductID");
bulkCopy.ColumnMappings.Add(
"ProductName", "Name");
bulkCopy.ColumnMappings.Add(
"QuantityPerUnit", "Quantity");
bulkCopy.DestinationTableName
= "Products_TopSelling";
bulkCopy.WriteToServer(reader);
}
}
reader.Close();
}
}

 

ColumnMappings集合用于映射源表和目的表之间的列。

3、从XML文件复制数据到数据库的表中

 

数据源并不局限于数据库的表,你也可以使用XML文件做数据源。 这里有一个非常简单的使用XML文件做数据源进行批量复制操作的例子。

 

 

<?xml version="1.0" encoding="utf-8" ?>
<Products>
<Product productID="1" productName="Chai" />
<Product productID="2" productName="Football" />
<Product productID="3" productName="Soap" />
<Product productID="4" productName="Green Tea" />
</Products>


 

/// <summary>
/// 使用XML作为数据源
/// </summary>
private static void PerformBulkCopyXMLDataSource()
{
string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connection=true";

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

 

首先把XML文件读进DataTable,然后再使用SqlBulkCopy类的WriteToServer方法。 因为目的表示是Products_TopSelling,所以我们必须执行列映射。
本文作者:网友 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读