看板 Database 關於我們 聯絡資訊
資料庫名稱:SQL Server 2000 資料庫版本:sp3 內容/問題描述: 以往我將前端的Method(例如ASP.NET資料存取層的Method) 對應到SQL Statement(或預存程序)時 都是採用下列方法 --------------------------------------------- 抓取學生資料的Method => GetDataByStudentID(int StudentID) 對應的SQL Statement就像以下例子一樣 SELECT * FROM TABLE WHERE StudentID = @StudentID --------------------------------------------- @StudnetID是傳進去的參數 但我現在遇到了一個問題 就是如果我所使用的Method 有使用兩個以上的過濾條件時候 而且這兩個過濾條件不一定得出現 這時候如果SQL Statement預先把WHERE子句寫死了 就有點糟糕了 例如抓取男生 身高為160的學生資料 => GetDataBySexAndHeight("男", 160) 對應的SQL statement會是如下 SELECT * FROM TABLE WHERE Sex='男' AND Height=160 如果今天我想要利用同樣的一個Method 但不設限任何條件 也就是要抓出所有的資料 Method裡面的參數就會是空的 GetDataBySexAndHeight("", "") 而因為SQL statement的WHERE子句已經寫死了 產生出的SQL code就會如下 SELECT * FROM TABLE WHERE Sex='' AND Height='' 這個SQL statement很明顯一看就知道是錯的 無法選出所有的資料 上述的例子只有兩個參數 每個參數都有出現 與不出現兩種可能 所以如果要每種可能的組合都寫一個method 就會2x2=4種method 參數越多 method就得跟著越多 顯然用method來對應不是一個好辦法 而我會有這個需求的原因是 .NET希望programmer利用參數來執行SQL指令 如果自己用字串相加的話 怕會有SQL injection的問題 所以雖然可以使用動態產生出WHERE子句 再將其合併到原先的SQL statement 但在ASP.NET裡面並不是很恰當的作法 而我目前利用的方法 是使用ADO.NET的DataView中的RowFilter字串 設定這些WHERE子句 功能上是可以滿足我的需求 但有兩個缺點 第一是存取資料的邏輯就跑出資料庫的範圍了 第二是如此一來就得先撈回所有資料 再使用DataView去過濾掉不要的資料 請問大家還有其他解法嗎 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.109.169.200 ※ 編輯: seagal 來自: 140.109.169.200 (09/21 20:52)
PsMonkey:用 like 硬幹? 09/21 21:03
seagal:用Like好像也可以 這主義真不賴:) 09/21 21:56
seagal:但Like可以用來比較字串 如果用來比較數字就又不行了 09/21 22:03
※ 編輯: seagal 來自: 140.109.169.200 (09/21 23:47)