如果要批量複製大量的數據,用ado.net或者其他orm框架逐條讀取並寫入,有時會耗時太長,滿足不了要求,此時SqlBulkCopy就可以出來大顯身手了,相信許多人瞭解或使用過它。 但實際使用時,還是會遇上些問題,這裡做些記錄,也許能幫你避開一些“坑”。 column mapping 問題 。 在設 ...
如果要批量複製大量的數據,用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萬條數據,列印一個+符號到屏幕上。
(不知道ul-li 列表為啥會變成窄窄的小段落,沒辦法了)