2015年9月28日 星期一

Dapper 練習題 - 新增多筆或大量資料

前一篇已經向大家介紹了 Dapper 這一個資料存取套件,可以作為解決專案仍須使用一般 T-SQL 操作但是又不想直接處理弱型別的情境,尤其是在比較強調使用「強型別」的 ASP.NET MVC / Web API 專案裡,可以不必硬著頭皮使用 Entity Framework(因為許多企業的系統環境不允許),而且也可以兼顧既有的商業邏輯包袱(都已經說是包袱了,還是希望可以早點解下並丟開)。

其實 Dapper 並不需要太多的介紹與教學,其實對於既有 ADO.NET + T-SQL 已經相當熟悉的開發者應該可以短時間上手,我所看到最多的問題應該會是在「物件導向」的觀念與使用,畢竟之前使用 ADO.NET + T-SQL 的操作處理都是直接使用弱型別,從取得資料一直到資料的顯示輸出,甚至資料的輸入,都沒有什麼機會用到所謂的物件導向,另外要特別強調的就是,不是在專案裡建立了好多個 class 然後使用類別在程式裡傳來傳去就可以叫做物件導向,例如你在一個類別的建構式裡塞了成千上百的程式然後又直接跟資料庫串接並且又有商業邏輯的處理,這完全不是物件導向,還是依然是在程序導向的開發。

嗯…… 這一篇所要講的跟上面所講的沒什麼關係(只是單純地抒發想法),Dapper 對於一次新增多筆資料的做法是相當簡單的,這篇也跟大家介紹如何處理一次新增多筆且大量的資料新增。

 


我在資料庫裡有這麼一個 Table [ Customer ]

image

相對應這個 Table 的類別定義如下:

   1: public class Customer
   2: {
   3:   public int CustomerID { get; set; }
   4:  
   5:   public int? PersonID { get; set; }
   6:  
   7:   public int? StoreID { get; set; }
   8:  
   9:   public int? TerritoryID { get; set; }
  10:  
  11:   public string AccountNumber { get; set; }
  12:  
  13:   public Guid rowguid { get; set; }
  14:  
  15:   public DateTime ModifiedDate { get; set; }
  16:  
  17: }

新增資料到 Pserson 的 T-SQL 如下:

   1: INSERT INTO [dbo].[Customer]
   2: (
   3:   [CustomerID],
   4:   [PersonID],
   5:   [StoreID],
   6:   [TerritoryID],
   7:   [AccountNumber],
   8:   [rowguid],
   9:   [ModifiedDate]
  10: )
  11: VALUES
  12: (
  13:   @CustomerID,
  14:   @PersonID,
  15:   @StoreID,
  16:   @TerritoryID,
  17:   @AccountNumber,
  18:   @rowguid,
  19:   @ModifiedDate
  20: );

先看看新增一筆資料的處理方式

image

新增資料結果

image

 

如果是新增多筆資料的話,是可以傳入 Customer Collection 的資料, 如下:

image

image

 

我們要一次新增大量的資料時,當然也可以使用上面的方式處理,假如現在有一份資料是從 CSV 檔案要做新增處理,資料量不多,大約是 19,820 筆的資料要一次新增,使用同樣的方式作處理,處理的方式與執行結果如下:

image

一次新增 19,820 筆的資料大約要花 6 秒多的時間,其實這個速度還可以更快一些,只要搭配使用 Transaction 就可以讓一次新增大量資料的速度更快一點,如下:

image

又或者你可以使用 TransactionScope Wrapper 的方式

image

 

加上 Transaction 或使用 TransactionScope 之後,一次新增大量資料的處理時間只有耗費 2 秒多,與原本的 6 秒多是減少了蠻多。

 


什麼時候會需要用到一次大量新增資料的處理呢?

通常是在做資料轉換或是每日資料運算、轉存的時候,不過大多數在遇到需要這樣大量資料處理的需求時,應該都不會在程式裡去做這樣的資料處理,而是會選擇使用 Stored Procedure,反而在程式裡直接處理大量資料的新增寫入機會是比較少,而且真的要處理大量資料新增寫入也有 Bulk Insert 可以使用。

基本上我在專案裡會使用到 Dapper 處理多筆或是數量多一點的資料新增處理會是在單元測試專案裡,因為需要去依據不同的情境去準備測試資料,所以會根據不同的情境去重新設定特定資料庫、資料表的資料內容。所以會有蠻頻繁的資料清除、寫入的處理,單元測試的時間都必須要短時間內完成,所以很多資料異動的處理時間就要錙銖必較。

希望這一篇的內容可以給大家帶來一點點的幫助。

 

延伸閱讀

MSDN - TransactionScope 類別 (System.Transactions)

MSDN - SqlConnection.BeginTransaction 方法 (System.Data.SqlClient)

 

以上

沒有留言:

張貼留言

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。