日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/3/21 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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[]都要快。 下面的代碼的作用是把數據從源表復制到目的表。

private?static?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();?????????????????
????????????????
??}??????????
}
這里有一對需要提及的知識點。 首先,我使用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类批量复制数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。