0

我有一个带有 asp.net gridview 的 asp.net 网页,其中包含以下查询:

 SelectCommand="SELECT * from details2 as t2 WHERE (t2.OCC IN ('+ @txtCOUNTRY +') OR t2.DCC IN ('+ @txtCOUNTRY +')) and t2.ac='Y'"

文本框txtCOUNTRY值可以具有以下值(例如):

'AR','ES'

但是参数@txtCOUNTRY似乎不正确,因为gridview没有显示任何内容。

如果我将其更改为(例如)它可以工作:

 SelectCommand="SELECT * from details2 as t2 WHERE (t2.OCC IN ('AR,'ES') OR t2.DCC IN ('AR','ES')) and t2.ac='Y'"

所以我只能假设@txtCOUNTRY参数写错了。

有任何想法吗 ?

4

1 回答 1

0

当您通过'AR','ES'SQL 参数传递值时,它们将自动被转义,这将使您的查询从字面上查找值:'AR','ES'

请参阅:参数化 SQL IN 子句

所以在你的情况下(因为你有一个逗号分隔的值列表,每个值都用单引号括起来):

SelectCommand = "SELECT * from details2 as t2 WHERE " &
    "(','+@txtCOUNTRY+',' LIKE '%'','+t2.OCC+''',%' OR ','+@txtCOUNTRY+',' LIKE '%'','+t2.DCC+''',%') " & 
    "and t2.ac='Y'"

如果您没有将值括在单引号中(例如:),AR,ES那么查询变得更具可读性,因为您不必在查询中转义单引号:

SelectCommand = "SELECT * from details2 as t2 WHERE " &
    "(','+@txtCOUNTRY+',' LIKE '%,'+t2.OCC+',%' OR ','+@txtCOUNTRY+',' LIKE '%,'+t2.DCC+',%') " & 
    "and t2.ac='Y'"

编辑以明确说明其工作原理。

因此,例如,提供AR,ES作为@txtCOUNTRY参数的值将产生一个条件:

,AR,ES, LIKE *,[t2.OCC],*   OR   ,AR,ES, LIKE *,[t2.DCC],*

如果模式匹配t2.OCCt2.DCC则此条件将是匹配的。ARES

这提供了一种将逗号分隔列表作为参数传递的简单方法,因此您的查询不能被 SQL 注入利用。

于 2014-12-23T19:58:36.317 回答