SqlBulkCopy(批量复制)使用方法

轉載:

SqlBulkCopy(批量复制)使用方法

Posted on 2011-02-16 11:01 宽田 阅读(3510) 评论(0) 编辑 收藏

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,所以我们必须执行列映射。

--------------------------------------以上沒有涉及事務,一下是使用事務的一個列子---------------------------------

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

}

}

}

时间: 2024-11-03 05:42:05

SqlBulkCopy(批量复制)使用方法的相关文章

SqlBulkCopy(批量复制)使用方法 &amp;&amp; SqlDataAdapter Update

SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法.SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地. WriteToServer方法可以处理的数据类型有DataRow[]数组,DataTable 和 DataReader. 你可以根据不同的情形使用不同的数据类型.SqlBulkCopy其原理是采用了SQL Server的BCP协议进行数据的批量复制. SqlBulkCopy(批量复制):批量复制速度极快

SqlBulkCopy 批量复制数据到数据表

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据 使用Datatable作为数据源的方式: 下面的代码使用到了ColumnMappings,因为目标表和数据源Datatable的结构不一致,需要这么一个映射来指定对应关系 public string SaveJHCData(LzShopBasicData[] datas)

使用asp.net 2.0中的SqlBulkCopy类批量复制数据

介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个SqlBulkCopy类,它可以帮助你从不同的数据源复制数据到SQL SERVER数据库. 本文中我将示范SqlBulkCopy类的不同应用. 数据库设计: 这个数据库的设计还是蛮简单的,它基于Northwind数据库的Products表.另外我还在Northwind数据库中创建了3个表. 详情可以看一

使用SqlBulkCopy类来批量复制数据

DataTable dt = new DataTable(); dt.Columns.Add("id", typeof(string)); for (int i = 0; i < 100; i++) { DataRow dr = dt.NewRow(); dr["id"] = "sadf" + i; dt.Rows.Add(dr); } using (SqlConnection conn = new SqlConnection(@"

SqlServer批量复制(bcp)[C#SqlBulkCopy]性能极低问题

背景 最近一段给xx做项目,这边最头疼的事情就是数据库入库瓶颈问题. 环境 服务器环境:虚拟机,分配32CPU,磁盘1.4T,4T,5T,6T几台服务器不等同(转速都是7200r),内存64G. 排查步骤 排查一:数据库恢复模式为简单模式,数据库和tempdb的初始大小.数据库文件初始化大小100G,日志文件初始化大小50G,两个文件都是自动增长(按10%):tempdb初始化大小10G*4个文件,日志5G*4个文件,两个文件都是自动增长(按10%),分布在两个磁盘中(但看了这篇文章后,有点傻眼

C# 使用 SqlBulkCopy 类批量复制数据到数据库

最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类. 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据. public class Conn { private static

【转】批量复制操作(SqlBulkCopy)的出错处理:事务提交、回滚

原文地址:http://blog.csdn.net/westsource/article/details/6658109 默认情况下,批量复制操作作为独立的操作执行. 批量复制操作以非事务性方式发生,不可能使其回滚. 如果需要在出错时回滚全部批量复制或它的一部分,可以使用 SqlBulkCopy 托管的事务,在现有事务中执行批量复制操作,或者在 System.Transactions Transaction 中登记它. 由于不同批次在不同事务中执行,因此,如果在批量复制操作期间发生错误,则当前批

SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints using (SqlBulkCopy bulkCopy = new SqlBulkCopy(GlobalString.ConnectionString, SqlBulkCopy

在事务中执行批量复制操作SqlBulkCopy,SqlTransaction .

Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上).SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案.还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势. 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可