2

所以我有这个查询:

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...,因为用户必须不需要根据所有列进行搜索。

任何想法?提前致谢。

PS:不能使用 LINQ 或类似的东西(-业务规则-)。

4

2 回答 2

3

您仍然可以将 SQL 参数化查询与 where close 一起使用(WHERE 将是动态的)。例如,我有一个为 NULL 的参数 @SerialNum,我有一个等于 455 的参数 @Code。

SELECT
     Column1
    ,Column2
FROM 
     YourTable
WHERE
    (
        @SerialNum IS NULL
        OR
        Column3 LIKE '%' + @SerialNum + '%'
    )
    AND
    (
        @Code IS NULL
        OR
        Column4 LIKE '%' + @Code + '%'
    )
于 2012-06-11T01:17:23.373 回答
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)要么应用了搜索(AND a = xxx)。

if您只需为每个搜索添加一个!

另外我会使用 StringBuilder 来清理字符串处理。

于 2012-06-11T01:16:53.687 回答