熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

使用SqlBulkCopy進行大批量數據遷移

2013-11-13 09:54:10  來源: .NET編程 

  下面我們先通過一個簡單的例子說明這個類的使用
  
  
  
  DateTime startTime;
   protected void Button_Click(object sender EventArgs e)
   {
   startTime = DateTimeNow;
   string SrcConString;
   string DesConString;
   SqlConnection SrcCon = new SqlConnection();
   SqlConnection DesCon = new SqlConnection();
   SqlCommand SrcCom = new SqlCommand();
   SqlDataAdapter SrcAdapter = new SqlDataAdapter();
   DataTable dt = new DataTable();
   SrcConString =
   ConfigurationManagerConnectionStrings[SrcDBConnectionString]ConnectionString;
   DesConString =
   ConfigurationManagerConnectionStrings[DesDBConnectionString]ConnectionString;
   SrcConConnectionString = SrcConString;
   SrcComConnection = SrcCon;
   SrcComCommandText = SELECT * From [SrcTable];
   SrcComCommandType = CommandTypeText;
   SrcComConnectionOpen();
   SrcAdapterSelectCommand = SrcCom;
   SrcAdapterFill(dt);
   SqlBulkCopy DesBulkOp;
   DesBulkOp = new SqlBulkCopy(DesConString
   SqlBulkCopyOptionsUseInternalTransaction);
   DesBulkOpBulkCopyTimeout = ;
   DesBulkOpSqlRowsCopied +=
   new SqlRowsCopiedEventHandler(OnRowsCopied);
   DesBulkOpNotifyAfter = dtRowsCount;
   try
   {
   DesBulkOpDestinationTableName = SrcTable;
   DesBulkOpWriteToServer(dt);
   }
   catch (Exception ex)
   { 

   }
   finally
   {
   SrcConClose();
   DesConClose();
   }
   }
  
   private void OnRowsCopied(object sender SqlRowsCopiedEventArgs args)
   {
   lblCounterText += argsRowsCopiedToString() + rows are copied
;
   TimeSpan copyTime = DateTimeNow startTime;
   lblCounterText += Copy Time: + copyTimeSecondsToString() + + copyTimeMillisecondsToString() + seconds;
   }
  接著具體分析這幾行代碼
  SqlBulkCopy DesBulkOp;
  DesBulkOp = new SqlBulkCopy(DesConString SqlBulkCopyOptionsUseInternalTransaction);先生成SqlBulkCopy 實例構造函數指定了目標數據庫使用SqlBulkCopyOptionsUseInternalTransaction是指遷移動作指定在一個Transaction當中如果數據遷移中產生錯誤或異常將發生回滾其他選項請參考MSDN
  
  DesBulkOpBulkCopyTimeout = ;
  指定操作完成的Timeout時間
  
   DesBulkOpSqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied);
   DesBulkOpNotifyAfter = dtRowsCount;
   try
   {
   DesBulkOpDestinationTableName = SrcTable;
   DesBulkOpWriteToServer(dt);
   }
  NotifyAfter屬性指定通知通知事件前處理的數據行數在這裡指定為表的行數並添加SqlRowsCopied事件輸出整個遷移過程的時間WriteToServer方法就是將數據源拷備到目標數據庫在使用WriteToServer方法之前必須先指定DestinationTableName屬性也就是目標數據庫的表名
  
  我們還可以自己定義一個Transaction例如
  
  SqlTransaction Transaction;
  Transaction =
  SrcComConnectionBeginTransaction();
  SqlBulkCopy DesBulkOp;
  DesBulkOp = new SqlBulkCopy(new SqlConnection(DesConString)
  SqlBulkCopyOptionsDefault
  Transaction);
  
  try
  {
  //
  }
  catch{}
  finally
  {
  TransactionCommit();
  }
  另外還有一個SqlBulkCopyColumnMapping類可以讓數據源字段映射到目標數據中命名不同的字段上也就是說如果目標數據和源數據的列名不同時可以用這個類進行映射
  SqlBulkCopyColumnMapping ColMap = new SqlBulkCopyColumnMapping(SrcCol DesCol);
  DesBulkOpColumnMappingsAdd(ColMap);
  或者可以直接添加映射
  DesBulkOpColumnMappingsAdd(SrcCol DesCol);
  性能問題
  我使用上面的例子測試遷移了萬條左右的記錄花的時間不到一秒應改說性能還是不錯的另外使用SQL Profile監視遷移事件可以看見請求記錄非常少只有幾條而已據說使用SqlBulkCopy可以大大減少數據遷移的時間
From:http://tw.wingwit.com/Article/program/net/201311/11914.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.