【问题标题】:ASP.NET passing value from textbox to selectcommand with IN vbASP.NET 将值从文本框传递到使用 IN vb 的选择命令
【发布时间】:2015-02-21 22:34:49
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: sql asp.net vb.net selectcommand


    【解决方案1】:

    当您通过 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 注入利用。

    【讨论】:

    • 好的,我记下了可以使用的参数。关于您的示例, LIKE 如何替换 IN ?
    • @user1135218 - 我更新了答案以提供有关其工作原理的更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多