SqlBulkCopy批量复制
一、概述
SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法。SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地。 WriteToServer方法可以处理的数据类型有DataRow[]数组,DataTable 和 DataReader。 你可以根据不同的情形使用不同的数据类型。SqlBulkCopy其原理是采用了SQL Server的BCP协议进行数据的批量复制。
二、表数据复制
1、数据表to数据表
将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 to 数据表
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; } } } }
3、XML to 数据表
数据源并不局限于数据库的表,你也可以使用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,所以我们必须执行列映射。