2008年10月14日

SqlParameters 應用篇

雖然標題是應用篇  但坎尼好像也沒寫過入門篇 (抓頭

回正題
本篇的應用是 隨著 user 選項不同  而執行不同的 t-sql 語法
且參數部分不盡相同

「為什麼說不盡相同呢?」 先來看下面抓圖
假設這是一個複合條件選擇的頁面
坎尼會依 user 選擇 而從 t1、t2、t3 三個資料表中分別取出資料
t1可能是個人資料、t2則為職業、t3為連絡資料
(先把 join 給放一邊  這個只是範例)

可以看到
i = 0 時  需要參數 id name birth
i = 1 時  需要參數 id job
i = 2 時  需要參數 id name tel

有發現嗎? id 這個參數重覆出現了三次  name 則是兩次
這種情況下  大部份的人應該都會寫成上圖的方式
利用 if 判斷 再將 parameter 加入 SqlCommand 當中
但這樣不嫌重覆造了太多輪子了嗎?

這邊坎尼要提供個簡單的方式
不過這邊要注意的是  這個方法好像支援 .NET 2.0 以上
1.1 似乎不能這麼寫  SqlCe 似乎也不能這麼做 (這個會再發一篇詳細講解)
直接來看抓圖吧


可以看到  坎尼把參數通通移到 if 的外面
在這邊 ADO.NET 會自動的判斷 parameter 的 name
所以就算加了 10 個 parameters  但.NET執行Sql指令時
也只會抓取它所需的那3個 parameters (依給予的參數名稱
「這樣做不會有問題嗎?!」
坎尼用 vs 2005 來做 一直都是 ok 的  如果有問題請寄信給坎尼 :D

好啦  講完啦  XDDDD   (被踹飛

其實真正的應用不在於 select  (坎尼覺得用 select 當範例大家會比較了解
而是 insert update 時  許多資料表的欄位很像 但又不太一樣
應客戶要求又要做在同一頁  (對他們來說  這幾張 Table 可能是相同的)

此時  苦命的 Programmer 就要像第一張圖那樣
利用 if 或 switch 去做判斷  再將資料 insert (或update) 進去資料庫
(別懷疑  這是坎尼工作上遇到的實際例子)

為了讓自己可以早點下班  以後維護也比較簡單(這地方見人見智)
坎尼不小心發現了這個偷吃步的方式
不過效能上有沒有影響倒是沒有測過  哪天比較空閒時再來測測看

最後補充個一點  在加入 Parameters 之前  記得習慣將 Parameters 清空
尤其是要用 for 迴圈跑 insert 或 update 的人

2 則留言:

Unknown 提到...

雖然看起來 .Net 2.0 之後的 SqlCommand 會很聰明的根據 CommandText 來判斷到底要使用哪些 SqlParameter,因此多塞也不會有問題,不過終究是在網路上多傳輸了一些資料,如果那幾張 table 加起來有幾十個欄位,而這個功能又常用到的話,應該是會有一些效能的影響吧 ~~
要維護方便的話也可以把每個狀況下要使用的 CommandText 和 SqlParameter 都作成一個 method,多花一些時間是一定的,但是對維護的人來講應該會比較踏實,不會還要想很多說是不是會不小心砍掉有用的參數...

坎尼 提到...

其實我遇到的是六七個Table
可是裡面大部分都只有兩三個欄位不同
所以才會這麼做
這情況真的很難遇到 (哪有人DB會這樣開 - -

不過講這個是為了帶出下一篇的主題
下篇會有另外一種寫入 parameter 的方式
和 Tim 你提到的方式很像
算是文章中兩張抓圖的綜合版

Google Spreadsheet 裡用規則運算式

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