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パラメータ化クエリを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検索ごとに1つ追加するだけです。

また、StringBuilderを使用して文字列処理をクリーンアップします。

于 2012-06-11T01:16:53.687 に答える