天天看點

使用ADO.NET2.0提升資料互動性能 使用SqlBulkCopy批量寫入資料庫

四:使用SqlBulkCopy批量裝載資料(僅限SqlClient)

   以往通路 SQL Server 2000 時,若有大量的資料記錄需要添加到資料庫内,例如從主機系統或是 NCR Teradata、Oracle等資料庫系統下載下傳大量資料記錄,我們想要将它們快速添加到 SQL Server 2000中,可以有的選擇是調用 T-SQL 的 Bulk Insert 文法、通過Linked Server 執行 SELECT INTO 文法或是執行 bcp.exe 工具程式,以及通過 DTS 的 Bulk Insert Task 或啟動Transform Data Task 的快速裝載(Use Fast Load)設定。

  但若要通過自行編寫的程式完成批次裝載,隻能以 C/C++ 調用 OLEDB 或 ODBC 的 Bulk API,無法通過 ADO.NET 或 ADO 等對象來執行。

   ADO.NET 2.0 的 SqlClient 提供了一個新的類稱為 SqlBulkCopy,它讓 DataSet 内大量的資料或是 DataReader通過資料流(Stream)直接讀取大量的記錄,可以快速将這些記錄添加到目的資料庫的資料表中。但要注意的是它并非如我們一般用的 bcp.exe工具程式,可以從某個符号分隔檔案讀取大量資料,選擇性地搭配格式檔案(Format File)将記錄裝載到資料庫中,或是将資料庫内的資料導出成為一個檔案。但由于DataSet 能內建 XML 資料,是以依然可以采用 SqlBulkCopy 類型,輕松地通過 DataSet 将 XML 檔案資料大量轉入到資料庫。

  可以利用SqlBulkCopy類快速寫入大批量資料,針對SQL Server的優化,可以寫入DataRow資料,DataTable,DataReader,并且可以映射不同的資料列名

  WriteToServer(DataTable)寫入資料表

  WriteToServer(DataRow[])批次寫入資料行

  WriteToServer(DataTable ,DataRowState)按行狀态寫入資料庫表

  WriteToServer(IDataReader)寫入DataReader對象

  下面是個示例:

  using (SqlConnection sqlcon =

   new SqlConnection("Data Source=192.168.80.242;user id=oa;password=oapassword;initial catalog=test"))

   {

   sqlcon.Open();

   using (SqlBulkCopy bcp = new SqlBulkCopy(sqlcon))

   {

  bcp.BulkCopyTimeout = 3000;

  bcp.DestinationTableName = "dbo.Test01";

  bcp.ColumnMappings.Add("id", "id");

  bcp.ColumnMappings.Add("name1", "name1");

  bcp.ColumnMappings.Add("name2", "name2");

  bcp.ColumnMappings.Add("name3", "name3");

   //映射到不同名列

  bcp.ColumnMappings.Add("changedname4", "name4");

  bcp.WriteToServer(dt);

  sqlcon.Close();

   }

   }

  但是SqlBulkCopy使用時要注意以下幾點:

  1.确認确實需要大容量更新在執行此操作,(幾十行的資料請盡量使用别的管道把).

  2.

  3.确認資料一緻性,與檢查機制,以免遇到主鍵沖突,資料不符格式等意外。

  4.

  3.SqlBulkCopy操作可能會導緻對目标表中繼資料的更改(例如,禁用限制檢查時)。如果出現這種情況,通路大容量插入表的并發快照隔離事務将失敗。

  4. SqlBulkCopy将向資料庫下大容量更新鎖,請注意并發性,以免其他連接配接因長時間等待而逾時。

  http://www.cnblogs.com/trisaeyes/archive/2006/12/30/608075.html