如果要批量復制大量的數據,用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 列表為啥會變成窄窄的小段落,沒辦法了)