ASP.NET使用IN vb将值从文本框传递到selectcommand

时间:2014-12-23 18:42:51

标签: sql asp.net vb.net selectcommand

我有一个带有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参数写错了。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

当您通过SQL参数传递值'AR','ES'时,它们将自动转义,这会使您的查询真正查找值:'AR','ES'

请参阅:Parameterize an SQL IN clause

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

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.DCCARES,则此条件匹配,因为模式将匹配。

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