作者seagal (会长绕跑了)
看板Database
标题[SQL ] 请问大家关於WHERE子句的问题
时间Thu Sep 21 20:33:40 2006
资料库名称: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)
1F:推 PsMonkey:用 like 硬干? 09/21 21:03
2F:推 seagal:用Like好像也可以 这主义真不赖:) 09/21 21:56
3F:推 seagal:但Like可以用来比较字串 如果用来比较数字就又不行了 09/21 22:03
※ 编辑: seagal 来自: 140.109.169.200 (09/21 23:47)