【问题标题】:sql parametrized query using LIKE使用 LIKE 的 sql 参数化查询
【发布时间】:2014-05-13 06:12:54
【问题描述】:

我尝试将参数传递给 quert,但它不起作用。最好的方法是什么?我不想连接字符串。这是我的查询:

string cmd = @"
SELECT
    *
FROM
    TABLE
WHERE 
    p.PromptTypeID = pt.ID 
    AND p.PromptDomainID = pd.ID 
    AND p.LanguageID = pl.ID 
    AND p.VoiceID = pv.ID 
    AND p.Active='Y'
    AND PromptText LIKE ?              
ORDER BY 
    p.ID DESC";

using (SqlCommand command = new SqlCommand())
            {
                command.CommandText = cmd;
                command.Transaction = transac;
                command.Connection = cnn;
                command.Parameters.Add("?", SqlDbType.VarChar, 50).Value = "%" + text + "%";
                using (SqlDataAdapter adp = new SqlDataAdapter(command))
                {
                    adp.Fill(dt);                        
                }
            }

我无法使用 LIKE 运算符传递值。我也尝试过使用@text 而不是“?”但它不起作用。有什么建议吗?

顺便说一下,'?' 附近的语法不正确SqlException

【问题讨论】:

  • 您遇到的错误是什么?
  • 看起来您至少在​​ SQL 中缺少类似值的文本撇号。应该是您的参数值的一部分。
  • @GordonLinoff '?' 附近的语法不正确
  • 请不要使用“它不起作用”。总是写你得到的具体错误。您需要写出使用@text 时发生的具体情况,并使用@text 发布代码。

标签: c# sql sql-server-2008 sql-parametrized-query


【解决方案1】:

我终于找到了解决办法。当我使用“.... LIKE %@text%”并使用command.Parameters.Add(new SqlParameter("@text", text)); 传递参数时,它会在“@text”异常附近给出不正确的语法。

但是..

我使用“.... LIKE @text”并使用command.Parameters.Add(new SqlParameter("@text", "%"+text+"%")); 传递参数,它可以工作。

【讨论】:

    【解决方案2】:

    你可以只使用字符串连接。

    cmd = cmd.Replace("?","'%" + text + "%'");
    

    【讨论】:

    • 这将完全否定参数点。请参阅下面的 Naveen 的答案(与乔的基本相同,但相对于 OP 的问题更完整、更优雅)。
    • 它有效,但它违反了 OP 的要求,并且完全是错误的方法。参数化查询的要点之一是减少 SQL 注入攻击的可能性,但通过规避您丢失的参数。仅仅因为它有效并不能使它成为一个有效的解决方案。
    • 不,他们没有,但他们是一个好的开始,也是 OP 想要的。你的回答仍然无效。还要检查我所说的:“减少 SQL 注入攻击的可能性”而不是“它们完全阻止 SQL 注入攻击”
    【解决方案3】:

    用一些 SQL 变量替换 ? 并更改您的 command.Parameters.Add,如下所示

    PromptText LIKE %@Text%
    
    cmd.Parameters.Add("@Text", varYourtext);
    

    【讨论】:

      【解决方案4】:

      试试

      AND PromptText LIKE @text
      

      command.Parameters.Add("@text"...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 2010-10-14
        • 2015-06-03
        • 2021-08-09
        相关资源
        最近更新 更多