所以我有这个问题:
var comm = @"SELECT * FROM `TABLE` ";
bool hasWhere = false;
if ( model.Serial > 0 ) {
comm += " WHERE `SERIAL` LIKE '%" + model.Serial + "%' ";
hasWhere = true;
}
if ( model.Id.HasValue && model.Id.Value > 0 ) {
if ( !hasWhere ) {
comm += " WHERE `NUIP` LIKE '%" + model.Id.Value + "%' ";
hasWhere = true;
} else
comm += " AND `NUIP` LIKE '%" + model.Id.Value + "%' ";
}
if ( model.Date.HasValue ) {
if ( !hasWhere ) {
comm += " WHERE `DATE` = '" + model.Date.Value + "' ";
hasWhere = true;
} else
comm += " AND `DATE` = '" + model.Date.Value + "' ";
}
....
....
....
我已经阅读过针对SQL注入的参数化查询等等。问题是,假设我有一个动态数量的WHERE子句(基于搜索模型),我该如何参数化查询?我不能放WHERE a = @A AND b=@B...
,因为用户不必根据所有列进行搜索。
有什么想法吗?提前谢谢。
P.S:无法使用LINQ或类似的东西(-business rules - )。
答案 0 :(得分:3)
您仍然可以使用SQL参数化查询,其中close(WHERE将是动态的)。例如,我有@SerialNum参数,它是NULL,我有一个参数@Code,等于455。
SELECT
Column1
,Column2
FROM
YourTable
WHERE
(
@SerialNum IS NULL
OR
Column3 LIKE '%' + @SerialNum + '%'
)
AND
(
@Code IS NULL
OR
Column4 LIKE '%' + @Code + '%'
)
答案 1 :(得分:1)
我使用这个技巧。
....
WHERE 1 = 1
AND a = a
AND b= @b
AND c = c
... etc....
即如果我不想搜索
,我会将列与自我进行比较var comm = @"SELECT * FROM `TABLE` WHERE 1 = 1 ";
if ( model.Serial > 0 ) {
comm += " AND `SERIAL` LIKE '%" + model.Serial + "%' ";
} else {
comm += " AND `SERIAL` = `SERIAL`";
}
if ( model.Id.HasValue && model.Id.Value > 0 ) {
comm += " AND `AND` LIKE '%" + model.Id.Value + "%' ";
} else {
comm += " AND `NUIP` = `NUIP` ";
}
....
WHERE 1 = 1
已被优化,无需记住是否已定义WHERE,并且所有搜索都已优化(AND a=a
)或已应用搜索({{1} })。
您只需为每次搜索添加一个AND a = xxx
!
此外,我还使用StringBuilder来清理字符串处理。