[翻譯]使用asp.net 2.0中的SqlBulkCopy類批量複製資料

來源:互聯網
上載者:User

原文地址:http://gridviewguy.com/ArticleDetails.aspx?articleID=233
[原文源碼下載]

[翻譯]使用asp.net 2.0中的SqlBulkCopy類批量複製資料

原文發布日期:2007.03.01
作者:AzamSharp
翻譯:webabcd

介紹:
在軟體開發中,把資料從一個地方複製到另一個地方是一個普遍的應用。 在很多不同的場合都會執行這個操作,包括舊系統到新系統的移植,從不同的Database Backup資料和收集資料。 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的預設值為“0”),其意思就是把每一行作為一個批次發送到資料庫。

設定不同的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資料庫。

我希望你會喜歡本文,祝編程愉快!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.