批量數據復制SqlBulkCopy使用經驗點滴(特別是超時處理)


  如果要批量復制大量的數據,用ado.net或者其他orm框架逐條讀取並寫入,有時會耗時太長,滿足不了要求,此時SqlBulkCopy就可以出來大顯身手了,相信許多人了解或使用過它。

  但實際使用時,還是會遇上些問題,這里做些記錄,也許能幫你避開一些“坑”。

 

  • column mapping 問題 。 在設置column時候,請注意字段的大小寫,特別是sql server,平時寫sql語句時候可以忽略大小寫,但是在這里一定要注意大小寫不能錯了。

 

  • 如果目標表中字段比源表中的短,那么源表中有記錄的實際數據長度超過目標表的字段,拷貝時會保存,此時檢查一下字段長度即可。

 

  • 超時問題,有時候數據量大時,會遇上錯誤“在操作完成之前超時時間已過或服務器未響應”。可以設置SqlBulkCopy.BulkCopyTimeout  ,這個屬性的單位是秒,默認是30秒。

 

  • 如果數據量實在大,建議設置SqlBulkCopy.BatchSize 屬性,默認是0,即將所有目標數據一股腦兒拷貝到目標表,設置了這個屬性,就分批拷貝。 如果設置了batchsize,假設10萬條記錄,需要10分鍾拷貝,timeout要設置超過10分鍾,如果設置batchsize=1萬,每次只要1分鍾,那么timeout只要大於1分鍾就可以了。timeout和batch的關系, 微軟文檔中沒有講明白,經過我的測試,確認timeout是每個batch的時間。

 

  • SqlRowsCopied 事件。假設拷貝的時間很長,而急性子的你希望能看到目前拷貝了多少數據,就可以使用這個事件,直接來段代碼吧
sqlbulkcopy.NotifyAfter = 10000;
sqlbulkcopy.SqlRowsCopied += new SqlRowsCopiedEventHandler((object sender,SqlRowsCopiedEventArgs e) =>
 {
      Console.Write("+");
  });

 

 

 以上代碼的效果是,每1萬條數據,打印一個+符號到屏幕上。

 

參考網址:https://docs.microsoft.com/zh-cn/dotnet/api/system.data.sqlclient.sqlbulkcopy?view=netframework-4.7.2

 

(不知道ul-li 列表為啥會變成窄窄的小段落,沒辦法了)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM