SqlBulkCopy 它不是個新玩意兒,但是我最近才認識它,「你不知道你還有哪些不知道」是一件很恐怖的事情,原來 SqlBulkCopy 在 .NET 2.0 就有了,它的出現讓 Insert 大量資料變得更方便了,我只能感嘆相見恨晚。
我是參考 Demo 哥寫的這篇文章 - 使用SqlBulkCopy將資料批次寫入資料庫。
測試環境
我已經在資料庫建立好一個資料表叫 TableTable
,只有兩個欄位 Id
、Name
,沒有主鍵、沒有索引,而資料庫版本是 SQL Server on Linux,OS 及硬體環境跟這篇文章一樣。
SqlBulkCopy
我們先來看看 SqlBulkCopy 這個類別的常用屬性跟方法:
BatchSize
:一次批次寫入多少筆資料NotifyAfter
:在寫入多少筆資料後呼叫SqlRowsCopied
事件BulkCopyTimeout
:逾時秒數ColumnMappings
:如果我們資料來源的 DataTable 的 ColumnName 跟要寫入的資料表的 ColumnName 是不一樣的,或是只寫入部分的欄位,就要在 ColumnMappings 新增額外的對應。DestinationTableName
:要寫入的資料表名稱WriteToServer()
:寫入資料的方法
下面是屬性值的參考範例
批次 Insert 大量資料
WriteToServer() 方法有幾個多載,它允許我們傳入 DataRow[]
、DataTable
、IDataReader
、DbDataReader
當做資料來源,我選擇使用 DataTable 來儲存資料來源,一次 create 三十萬筆,欄位名稱跟欄位的資料型別都是跟資料庫中的資料表是對應的。
直接指定目標資料表之後,呼叫 WriteToServer() 方法。
我們可以看到三十萬筆,一秒六,資料就進去了。
偏要用 INSERT INTO 語法會怎樣?
我們來看看一般用 INSERT INTO 語法搭配 Dapper,一次寫入三十萬筆資料。
執行結果(它真的有在跑,別認為是當掉了。)
這次算是交了 SqlBulkCopy 這個朋友,看它在處理大量資料的英姿,既豪邁又奔放,外加在送資料進資料庫時不小心霸氣外露,誰看了都會被它給攝服。
< Source Code >