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

  若是要批量複製大量的數據,用ado.net或者其餘orm框架逐條讀取並寫入,有時會耗時太長,知足不了要求,此時SqlBulkCopy就能夠出來大顯身手了,相信許多人瞭解或使用過它。sql

  但實際使用時,仍是會趕上些問題,這裏作些記錄,也許能幫你避開一些「坑」。api

 

  • 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.2app

 

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

相關文章
相關標籤/搜索