开发者社区> 技术小甜> 正文

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

简介:
+关注继续查看
  介绍:
在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用。 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据。 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[]都要快。 下面的代码的作用是把数据从源表复制到目的表。
 
InBlock.gifprivate static void PerformBulkCopy()    
InBlock.gif
InBlock.gif    string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connection=true"
InBlock.gif                                                 
InBlock.gif    // 源    
InBlock.gif    using (SqlConnection sourceConnection = new SqlConnection(connectionString)) 
InBlock.gif    { 
InBlock.gif        SqlCommand myCommand = new SqlCommand("SELECT * FROM Products_Archive", sourceConnection); 
InBlock.gif        sourceConnection.Open(); 
InBlock.gif        SqlDataReader reader = myCommand.ExecuteReader();    
InBlock.gif                                 
InBlock.gif        // 目的    
InBlock.gif        using (SqlConnection destinationConnection = new SqlConnection(connectionString)) 
InBlock.gif        { 
InBlock.gif            // 打开连接    
InBlock.gif            destinationConnection.Open(); 
InBlock.gif                                 
InBlock.gif            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString)) 
InBlock.gif            { 
InBlock.gif                bulkCopy.BatchSize = 500; 
InBlock.gif        bulkCopy.NotifyAfter = 1000; 
InBlock.gif                bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied); 
InBlock.gif                bulkCopy.DestinationTableName = "Products_Latest"
InBlock.gif                bulkCopy.WriteToServer(reader);                                         
InBlock.gif            } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif        reader.Close();                                    
InBlock.gif                                 
InBlock.gif    }                     
InBlock.gif}

这里有一对需要提及的知识点。 首先,我使用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表里。 这两个表有着不同的字段名,具体可以看一下上面的“数据库设计”一节下的。
 
InBlock.gifprivate static void PerformBulkCopyDifferentSchema() 
InBlock.gif
InBlock.gif    string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connection=true"
InBlock.gif 
InBlock.gif    DataTable sourceData = new DataTable(); 
InBlock.gif 
InBlock.gif    // 源    
InBlock.gif    using (SqlConnection sourceConnection = new SqlConnection(connectionString)) 
InBlock.gif    { 
InBlock.gif        SqlCommand myCommand = new SqlCommand("SELECT TOP 5 * FROM Products_Archive", sourceConnection); 
InBlock.gif        sourceConnection.Open(); 
InBlock.gif        SqlDataReader reader = myCommand.ExecuteReader(); 
InBlock.gif 
InBlock.gif        // 目的 
InBlock.gif        using (SqlConnection destinationConnection = new SqlConnection(connectionString)) 
InBlock.gif        { 
InBlock.gif            // 打开连接 
InBlock.gif            destinationConnection.Open(); 
InBlock.gif 
InBlock.gif            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString)) 
InBlock.gif            { 
InBlock.gif                bulkCopy.ColumnMappings.Add("ProductID""ProductID"); 
InBlock.gif                bulkCopy.ColumnMappings.Add("ProductName""Name"); 
InBlock.gif                bulkCopy.ColumnMappings.Add("QuantityPerUnit""Quantity"); 
InBlock.gif                bulkCopy.DestinationTableName = "Products_TopSelling"
InBlock.gif                bulkCopy.WriteToServer(reader); 
InBlock.gif            } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif        reader.Close(); 
InBlock.gif 
InBlock.gif    } 
InBlock.gif}
ColumnMappings集合用于映射源表和目的表之间的列。
从XML文件复制数据到数据库的表中
数据源并不局限于数据库的表,你也可以使用XML文件做数据源。 这里有一个非常简单的使用XML文件做数据源进行批量复制操作的例子。 
(Products.xml)
InBlock.gif<?xml version="1.0" encoding="utf-8" ?> 
InBlock.gif<Products> 
InBlock.gif    <Product productID="1" productName="Chai" /> 
InBlock.gif    <Product productID="2" productName="Football" /> 
InBlock.gif    <Product productID="3" productName="Soap" /> 
InBlock.gif    <Product productID="4" productName="Green Tea" /> 
InBlock.gif</Products>
 
InBlock.gifprivate static void PerformBulkCopyXMLDataSource() 
InBlock.gif
InBlock.gif    string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connection=true"
InBlock.gif 
InBlock.gif    DataSet ds = new DataSet(); 
InBlock.gif    DataTable sourceData = new DataTable();    
InBlock.gif    ds.ReadXml(@"C:Products.xml"); 
InBlock.gif 
InBlock.gif    sourceData = ds.Tables[0]; 
InBlock.gif 
InBlock.gif    // 目的    
InBlock.gif    using (SqlConnection destinationConnection = new SqlConnection(connectionString)) 
InBlock.gif    { 
InBlock.gif        // 打开连接    
InBlock.gif        destinationConnection.Open(); 
InBlock.gif 
InBlock.gif        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString)) 
InBlock.gif        { 
InBlock.gif            // 列映射 
InBlock.gif            bulkCopy.ColumnMappings.Add("productID""ProductID"); 
InBlock.gif            bulkCopy.ColumnMappings.Add("productName""Name"); 
InBlock.gif                                         
InBlock.gif            bulkCopy.DestinationTableName = "Products_TopSelling"
InBlock.gif            bulkCopy.WriteToServer(sourceData); 
InBlock.gif        } 
InBlock.gif    } 
InBlock.gif}
首先把XML文件读进DataTable,然后再使用SqlBulkCopy类的WriteToServer方法。 因为目的表示是Products_TopSelling,所以我们必须执行列映射。 


结论 

本文中我示范了如何使用.NET 2.0引入的SqlBulkCopy类。 SqlBulkCopy类可以非常简单的把数据从一个数据源复制到SQL SERVER数据库。














本文转自周金桥51CTO博客,原文链接:http://blog.51cto.com/zhoufoxcn/166052 ,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Excel中添加并使用宏实现批量更新数据
一、状况描述    当我们需要后台更新大量数据的时候,可以使用该功能。二、解決方案    (1)新建一个Excel文件,并另存为启用宏的Excel工作簿,扩展名为.xlsm。    (2)在Excel中添加按钮。
1156 0
HBase BulkLoad批量写入数据实战
1.概述 在进行数据传输中,批量加载数据到HBase集群有多种方式,比如通过HBase API进行批量写入数据、使用Sqoop工具批量导数到HBase集群、使用MapReduce批量导入等。这些方式,在导入数据的过程中,如果数据量过大,可能耗时会比较严重或者占用HBase集群资源较多(如磁盘IO、HBase Handler数等)。
1638 0
.NET数据库编程求索之路--7.使用ADO.NET实现(工厂模式-实现多数据库切换)(1)
7.使用ADO.NET实现(工厂模式-实现多数据库切换)(1)     7.1 解决方案框架 解决方案(.sln)包含以下几个项目: (1)类库项目HomeShop.DbUtility,数据访问实用工具; (2)类库项目HomeShop.
763 0
SQL2005/2008手工注入之批量爆数据for xml path
http://www.cqsec.com/read/SQL2005_2008_Injection_By_Hand_For_XML_Path ...
499 0
.NET数据库编程求索之路--7.使用ADO.NET实现(工厂模式-实现多数据库切换)(2)
7.使用ADO.NET实现(工厂模式-实现多数据库切换)(2)     7.3 数据访问层工厂HomeShop.DALFactory      1 using System; 2 using System.
908 0
.NET数据库编程求索之路--5.使用ADO.NET实现(三层架构篇-使用List传递数据)(3)
5.使用ADO.NET实现(三层架构篇-使用List传递数据)(2)   作者:夏春涛 xchunta@163.com 转载请注明来源:http://www.cnblogs.com/SummerRain/archive/2012/07/26/2610957.
513 0
.NET数据库编程求索之路--4.使用ADO.NET实现(三层架构篇-使用Table传递数据)(2)
4.使用ADO.NET实现(三层架构篇-使用Table传递数据)(2) 作者:夏春涛 xchunta@163.com 转载请注明来源:http://www.cnblogs.com/SummerRain/archive/2012/07/25/2609132.
512 0
.NET数据库编程求索之路--6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(1)
6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(1)    【 夏春涛 email: xchuntao@163.com  blog: http://www.cnblogs.
770 0
WPF:使用Json.NET在TreeView中树形显示JSON数据
原文  WPF:使用Json.NET在TreeView中树形显示JSON数据 据 读者可以参考这个开源的可以树形显示XML和JSON的工具: Mgen Object 603:XML/JSON树形显示小工具 或者一个更大的开源工程(构建和分析HTTP并支持XML及JSON的树形显示): Mgen Bluckbadda   效果如下: (每一个项目中的左侧黑字是数据的值,右侧灰字是数据的类型。
1841 0
[20170105]关于使用datafilecopy恢复.txt
[20170105]关于使用datafilecopy恢复.txt --如果指定恢复数据文件是从datafilecopy,必须加括号,写一个例子说明: 1.环境: SYS@book> @ &r/ver1 PORT_STRING             ...
846 0
+关注
10145
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载