使用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[]都要快。 下面的代碼的作用是把數據從源表復制到目的表。
{
??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();?????????????????
????????????????
??}??????????
}這里有一對需要提及的知識點。 首先,我使用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表里。 這兩個表有著不同的字段名,具體可以看一下上面的“數據庫設計”一節下的。
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集合用于映射源表和目的表之間的列。
從XML文件復制數據到數據庫的表中
數據源并不局限于數據庫的表,你也可以使用XML文件做數據源。 這里有一個非常簡單的使用XML文件做數據源進行批量復制操作的例子。
(Products.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>
?
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,所以我們必須執行列映射。
結論
本文中我示范了如何使用.NET 2.0引入的SqlBulkCopy類。 SqlBulkCopy類可以非常簡單的把數據從一個數據源復制到SQL SERVER數據庫。
我希望你會喜歡本文,祝編程愉快!
轉載于:https://www.cnblogs.com/zhoufoxcn/archive/2007/11/07/2515745.html
總結
以上是生活随笔為你收集整理的使用asp.net 2.0中的SqlBulkCopy类批量复制数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 世界杯十六强合影壁纸
- 下一篇: 关于网站URL转码的问题