介绍:
在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用。 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据。 ASP.NET 2.0有一个SqlBulkCopy类,它可以帮助你从不同的数据源复制数据到SQL SERVER数据库。 本文中我将示范SqlBulkCopy类的不同应用。
数据库设计:
这个数据库的设计还是蛮简单的,它基于Northwind数据库的Products表。另外我还在Northwind数据库中创建了3个表。 详情可以看一下下面的数据库关系图。
Products_Archive 和Products_Latest有与Products表相同的结构,而Products_TopSelling表则与它们不同。 稍后我将在本文解释Products_TopSelling表的用途。
Products_Archive表包含770,000行。 你不用管这些数据是如何得到的,你只需要考虑如何把所有这些数据复制到Products_Latest表里。
从Products_Archive表 复制数据到 Products_Latest表:
SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地。 WriteToServer方法可以处理的数据类型有DataRow[]数组,DataTable 和 DataReader。 你可以根据不同的情形使用不同的数据类型,但是更多时候选择DataReader是一个比较好的主意。 这是因为DataReader是一个只向前的、只读的数据流,它不会保存数据,所以要比DataTable 和 DataRows[]都要快。 下面的代码的作用是把数据从源表复制到目的表。
privatestaticvoidPerformBulkCopy()
{
stringconnectionString=@"Server=localhost;Database=Northwind;Trusted_Connection=true";
//源
using(SqlConnectionsourceConnection=newSqlConnection(connectionString))
{
SqlCommandmyCommand=newSqlCommand("SELECT*FROMProducts_Archive",sourceConnection);
sourceConnection.Open();
SqlDataReaderreader=myCommand.ExecuteReader();
//目的
using(SqlConnectiondestinationConnection=newSqlConnection(connectionString))
{
//打开连接
destinationConnection.Open();
using(SqlBulkCopybulkCopy=newSqlBulkCopy(destinationConnection.ConnectionString))
{
bulkCopy.BatchSize=500;
bulkCopy.NotifyAfter=1000;
bulkCopy.SqlRowsCopied+=newSqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
bulkCopy.DestinationTableName="Products_Latest";
bulkCopy.WriteToServer(reader);
}
}
reader.Close();
}
}
这里有一对需要提及的知识点。 首先,我使用DataReader来从数据库的表中读取数据。 Products_Latest是目的表,因为数据要从Products_Archive表复制到Products_Latest表。 bulkCopy对象提供了一个SqlRowCopied事件,在每次处理完NotifyAfter属性指定的行数时发生。 本例中的意思就是每处理完1000行就触发一次该事件,因为NotifyAfter被设置成了1000
BatchSize属性是非常重要的,程序性能如何主要就依靠着它。 BatchSize的意思就是同每一批次中的行数,在每一批次结束时,就将该批次中的行发送到数据库。 我将BatchSize设置成了500,其意思就是reader每读出500行就将他们发送到数据库从而执行批量复制的操作。 BatchSize的默认值是“1”,其意思就是把每一行作为一个批次发送到数据库。
设置不同的BatchSize在性能上将给你带来不同的结果。 你应该根据你的需求进行测试,来决定BatchSize的大小。
在不同的映射表之间复制数据
在上面的例子中两个表具有相同的结构。 有时,你需要在具有不同结构的表之间复制数据。 假如你要从Products_Archive表中把所有的产品名称及其数量复制到Products_TopSelling表里。 这两个表有着不同的字段名,具体可以看一下上面的“数据库设计”一节下的。
privatestaticvoidPerformBulkCopyDifferentSchema()
{
stringconnectionString=@"Server=localhost;Database=Northwind;Trusted_Connection=true";
DataTablesourceData=newDataTable();
//源
using(SqlConnectionsourceConnection=newSqlConnection(connectionString))
{
SqlCommandmyCommand=newSqlCommand("SELECTTOP5*FROMProducts_Archive",sourceConnection);
sourceConnection.Open();
SqlDataReaderreader=myCommand.ExecuteReader();
//目的
using(SqlConnectiondestinationConnection=newSqlConnection(connectionString))
{
//打开连接
destinationConnection.Open();
using(SqlBulkCopybulkCopy=newSqlBulkCopy(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集合用于映射源表和目的表之间的列。
从XML文件复制数据到数据库的表中
数据源并不局限于数据库的表,你也可以使用XML文件做数据源。 这里有一个非常简单的使用XML文件做数据源进行批量复制操作的例子。
(Products.xml)
<?xmlversion="1.0"encoding="utf-8"?>
<Products>
<ProductproductID="1"productName="Chai"/>
<ProductproductID="2"productName="Football"/>
<ProductproductID="3"productName="Soap"/>
<ProductproductID="4"productName="GreenTea"/>
</Products>
privatestaticvoidPerformBulkCopyXMLDataSource()
{
stringconnectionString=@"Server=localhost;Database=Northwind;Trusted_Connection=true";
DataSetds=newDataSet();
DataTablesourceData=newDataTable();
ds.ReadXml(@"C:Products.xml");
sourceData=ds.Tables[0];
//目的
using(SqlConnectiondestinationConnection=newSqlConnection(connectionString))
{
//打开连接
destinationConnection.Open();
using(SqlBulkCopybulkCopy=newSqlBulkCopy(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,所以我们必须执行列映射。
结论
本文中我示范了如何使用.NET 2.0引入的SqlBulkCopy类。 SqlBulkCopy类可以非常简单的把数据从一个数据源复制到SQL SERVER数据库。
我希望你会喜欢本文,祝编程愉快!
分享到:
相关推荐
利用C#+ASP.Net 2.0技术实现对SQL2005的数据快速拷贝处理程序例子代码。
C# 使用SqlBulkCopy类批量复制大数据
C# 利用SqlBulkCopy 高性能批量插入海量数据 高效批量插入数据
主要介绍了C#使用SqlBulkCopy批量复制数据到数据表的方法,较为详细的讲述了SqlBulkCopy批量复制数据到数据表的原理与实现技巧,需要的朋友可以参考下
SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法。SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地。 WriteToServer方法可以处理的数据类型有DataRow[]数组,...
使用C#自带SqlBulkcopy类,批量插入数据库,与一般insert into 插入效率相比,插入速度一个天一个地,效果很明显。特别用在导入大量数据时。
Z.SqlBulkCopy.Extension第三...使用时直接按照.net中sqlbulkcopy的使用方法调用执行就可以,很方便,没有什么特别的。所以,这是z项目人员,把整个库称为Extension扩展库的原因。 少赚点积分。相互支持。zip压缩文件。
本资源实现了利用sqlBulkCopy实现大批量传输数据,提供数据库,数据库中有一个sql语句将该语句执行一次即可向数据表中插入十万条数据,根据需要可执行多次。 本资源使用C#语言,数据库为sqlserver,经测试六十万条...
基于面向对象的、运行于.NET Framework之上的高级程序设计语言C#,采用Timer定时器、ADO.NET2.0的SqlBulkCopy技术,开发的矿山智能出入井考勤软件系统;系统将KJ405T人员定位系统与矿山企业考勤系统相结合,解决了智能...
SQL 批量复制 SQL 批量复制是 ODBC 批量复制 API 的 .NET 包装器。 有关详细信息,请参阅 。
于是乎,下demo,测试,改成自己一般使用的方法测试,NND,还真可以说是极速。 在此贴上我的Demo:SqlBulkCopy.rar 代码如下: using System; using System.Diagnostics; using System.Data; using System.Data....
Net中批量插入的几种实现方法之间的比较:循环添加 每次1行 循环添加 每次1000行 SqlBulkCopy批量添加 表值参数批量添加
SqlBulkCopy SQL2005 批量插入数据 性能优化
下面的控制台应用程序演示如何使用 SqlBulkCopy 类加载数据。在此示例中,使用 SqlDataReader 将数据从 SQL Server 2005 AdventureWorks 数据库中的 Production.Product 表复制到同一数据库中的相似表。 重要说明...
需要批量导入数据到Sqlserver的同学们,这是福音,不用担心导入数据和已有数据的冲突问题(这是.NET中sqlbulkcopy的不足),直接合并更新就可以了。 Z项目还有很多好东西,有兴趣自己可以去看看。 本部分是dll程序集...
使用C#自带SqlBulkcopy类,批量插入数据库,与一般insert into 插入效率相比,插入速度一个天一个地,效果很明显。特别用在导入大量数据时。
.net 用MysqlBulkCopy方式,批量添加数据,
C#z中连接数据库的,如有需要可以借,这个开发是项目中必备的的