選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
2 分鐘閱讀時間 (469 個字)

新增多筆資料的好幫手 - SqlBulkCopy

unsplash-coding103

前情提要:

因為專案要求須要開發一支程式,需要定期將A資料庫中的多個資料表更新到B資料庫,由於需要搬動多個資料表的大筆資料便找到了這個方法 SqlBulkCopy。


SqlBulkCopy介紹 : 

SqlBulkCopy 可讓您有效率地大量載入具有另一個來源的資料之 SQL Server 資料表。

此方法可以一次將大量的來源資料寫入MSSQL,來源可以是 DataRow[] 、DataTable、DataReader,本次的使用方式為取得A資料表資料後,將資料轉成要新增入資料庫的DataTable,再將DataTable使用WriteToServer方法將DataTable內的資料複製到SqlBulkCopy物件的目標資料表中。


SqlBulkCopyOptions : 

下方列出了SqlBulkCopyOptions的方法,通常比較會使用到的是

  1. KeepIdentity:保留來源的PK值,否則會出現複製過去的資料產生標識列發現變化的情況!
  2.  KeepNulls: 資料為空時不填入預設值。
CheckConstraints 在插入資料時檢查條件約束。 根據預設,不會檢查條件約束。
Default 使用所有選項的預設值。
FireTriggers若已指定,則會導致此伺服器對於正在插入至此資料庫的資料列,引發插入觸發程序。
KeepIdentity保留來源識別值。 如果未指定,則識別值依目的地指派。
KeepNulls不論預設值的設定為何,均保留目的地資料表中的 null 值。 如果未指定,則 null 值會以適用的預設值取代。
TableLock在大量複製作業期間,取得大量更新鎖定。 如果未指定,則會使用資料列鎖定。
UseInternalTransaction若已指定,則大量複製作業的每個批次將在交易內發生。 如果您指定這個選項,同時也提供 SqlTransaction 物件給建構函式,則 ArgumentException 就會發生。
//將取得資料轉成DataTable 型態
System.Data.DataTable dt = ToDataTableByList(model);
//設定連線字串、使用方式、SqlTransaction
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, sqlTrans))
{
    //目的資料表名稱
    bulkCopy.DestinationTableName = "資料表名稱";
    //批次執行資料數量
    bulkCopy.BatchSize = 1000;
    //Timeout設定
    bulkCopy.BulkCopyTimeout = 600;

    try
    {
        //將資料複製到指定資料表中
        bulkCopy.WriteToServer(dt);
    }
    catch (Exception)
    {
        flag = false;
        //復原交易
        sqlTrans.Rollback();
    }
    finally
    {
        //認可交易
        sqlTrans.Commit();
        //執行其他功能
    }
}
                    
                    
                     


心得:

在這之前也有需要匯入大量資料的需求產生,可是當時不知道這個做法,所以只能組好資料後利用程式去執行Insert的SQL語法,這樣既費時又很難去進行除錯。

當使用這個方式後大大減少了執行的時間及效能,令人感覺發現了另外一片天,分享給大家希望有幫助到需要的人。


來源參考:

SqlBulkCopy

[.net mvc][SQL] 大量批次新增 Bulk Insert (SqlBulkCopy) - 屎弟夫


心靈成長-"灰階思考"摘要分享 #後篇
心靈成長-"灰階思考"摘要分享 #前篇

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2025/08/21, 週四

Captcha 圖像