【问题标题】:Sql Query Parameter Name Must Be Defined必须定义sql查询参数名称
【发布时间】:2014-02-15 09:11:55
【问题描述】:

您好,我有这个 SQL 查询:

SQL = "SELECT SUM( " + "CASE WHEN rn =1" + "THEN v.FirstAmount" 
      + "WHEN rn =2" + "THEN v.SecondAmount " + "ELSE v.ThirdAmount " + "END ) " 
      + "FROM (" + "SELECT cv. * , @rn := IF( @vi = `Violation ID` , @rn +1, 1 ) AS rn,          
       @vi := `Violation ID` " + "FROM class_violation cv" + "CROSS JOIN (" 
      + "SELECT @rn :=0, @vi := ''" + ")CONST" + "ORDER BY `Violation ID`" + ")cv" 
      + "JOIN violation v ON cv.`Violation ID` = v.`Violation ID` " 
      + "JOIN class_record tr ON cv.`Class No.` = tr.`Class No.` " 
      + "WHERE tr.`Class ID` = '" + where + "'";

我得到这个错误:

MySql.Data.MySqlClient.MySqlException: Fatal Error encountered during
command execution ---> MySql.Data.MySqlClient.MySqlException: Parameter
'@rn' must be defined
 at
MySql.Data.MySqlClient.Statement.SerializeParameter(MySqlParameterCollection
parameters, MySqlPacket packet, String parmName, Int32 parameterIndex)
    at MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql,
    MySqlParameterCollection parameters,MySqlPacket packet)

如何更正我的 SQL 查询并定义参数?

【问题讨论】:

  • 如果您将 SQL 查询从字符串连接混乱中提取出来并将其粘贴为完整的 SQL 查询,您可能会得到更好的答案..
  • 您的C# 代码在哪里?您是否为所有Parameters(包括@rn)提供value
  • 此外,您应该参数化整个查询 - 例如,您的 "WHERE tr.``Class ID`` = '" + where + "'" 对 SQL 注入开放。
  • 如果我粘贴完整的 SQL 查询,它不会让我这样做。它在这里说我的问题是完整的代码在您的问题上添加一些细节等。
  • 您仍然应该养成参数化所有 SQL 的习惯。它使您的查询更易于阅读,并避免许多转换问题以及保护您免受 SQL 注入攻击。你永远不知道什么时候有人会把你的“练习”代码复制到一个真实的应用程序中。另外,如果练习是为了提高你的技能,你为什么不想遵循最重要的最佳实践呢?

标签: c# mysql sql


【解决方案1】:

我想我知道如何回答我的问题。在我的连接字符串中,我刚刚添加了 Allow User Variables = True 并且它现在可以工作了!

【讨论】:

  • 好的,有趣的问题是您是否仍然可以使用 .NET 命令参数,或者这是否会禁用它。如果他能够区分这两者......
猜你喜欢
  • 1970-01-01
  • 2018-11-14
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多