2010年6月1日

[ADO.NET] 善用 SqlDataAdapter 執行大量指令並傳回查詢資料

今天來介紹一下好用的 DataAdapter

I. 前言

很久很久以前,坎尼常遇到一個問題
「新增完一筆資料之後,要回傳該資料的ID」

如果 ID 是自己取 Max + 1 就還能控制
但要是遇到是用 sequence 方式建立的流水號
往往還要拆成兩段語法,建立完資料之後再取出

其實大可不必那麼麻煩,可以將 SQL Statement 串接在一起
(記得用 ; 隔開不同的指令)
再用 SqlCommandSqlDataAdapter 執行即可

II. 實戰

下圖綠色框部分,用 Sql Server 提供的 Temp Tables 語法
分別建立了兩個臨時資料表,並各加入兩筆資料
再用 SELECT 語法將兩個資料表 JOIN 的結果回傳
ms01既然 CreateInsert 語法都在 SelectCommand
參數當然也是要加進 SelectCommand 裡 (見上圖藍色框)
記得不要放到 UpdateCommand 或 InsertCommand 去

實際執行情況:確實建立了 Table 並取得 JOIN 成功的資料
ms03

另外坎尼又做了小小的測驗,驗證一下臨時資料表有沒有被砍掉
ms02 
事實證明,在上一次 .Fill 結束之後,暫存資料表是會自動清掉
而 Temp Table 的定義是:只存在該使用者連線時
ms04 
這表示 DataAdapter 在 .Fill 之後就會自動把連線關閉
下一次的 .Fill 其實是另外再重新開啟另一個連線

III. 小結

坎尼以前常看到有人用 DataAdapter
卻在執行前後加上 Connection.Open() 及 Connection.Close()
其實這些動作都是不必要的

DataAdapter 在執行時,都會檢查目前和 DB 的連線
執行結束後即會自動關閉與 DB 的連線

希望這些觀念對讀者們有幫助 :)

2 則留言:

WIT 提到...

謝謝阿尼 :)

Unknown 提到...

話說取號是個挺 tricky 的東西,處理不好的話可能會造成 ID 重複 ... 用流水號感覺比較保險一點 :p

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D