SQL查询参数名必须定义。

3

你好,我有这个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查询并定义参数?


4
如果您将SQL查询语句从字符串拼接混乱中分离出来,并将其作为完整的SQL查询粘贴,您可能会得到更好的答案。 - Simon Whitehead
你的 C# 代码在哪里?你为所有的参数提供了值,包括 @rn 吗? - Iqbal
1
此外,您应该对整个查询进行参数化处理 - 您的 "WHERE tr.``Class ID`` = '" + where + "'" 可能会受到 SQL 注入攻击。 - Jon Skeet
2
你应该养成将所有的SQL参数化的习惯。这样做可以使你的查询更易于阅读,避免许多转换问题和保护你免受SQL注入攻击。同时,你永远不知道有人会将你的“练习”代码复制到实际应用中。此外,如果这个“练习”是为了提高你的技能,为什么不遵循最重要的最佳实践呢? - Jon Skeet
我有一种感觉,这是查询内部变量和.NET解释@rn为查询本身的参数之间混淆了。但看起来你喜欢将@rn用作变量... - ZoolWay
显示剩余7条评论
1个回答

7

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


好的,有趣的问题是,如果您仍然可以使用.NET命令参数,还是这会禁用它。或者他能够区分这两者... - ZoolWay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接