【发布时间】:2019-10-08 06:58:52
【问题描述】:
我有一个在 MySql 工作台中运行良好的查询,但在通过 MySqlCommand.ExecuteReader 运行时会产生语法错误"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':= 0+1 AS Rank, z.* 
FROM(SELECT MemberId, Valu' at line 2"。有问题的语法是选择内部的变量赋值(即SELECT @r := @r + 1)。我正在使用 .net 连接器 v.6.9.9 以防万一。另外,这是我的连接字符串:"server=mymysqlserveraddress;port=3306;database=dbName;user id=username;password=********;Convert Zero Datetime=True;Allow User Variables=true"
我已尝试在连接字符串中设置 Allow User Variables=true,如下所示:Is it possible to use a MySql User Defined Variable in a .NET MySqlCommand?
我寻找了与此匹配的其他问题,但最终,只找到了一个相同的问题,但对于 java 中的 hibernate:How can I use MySQL assign operator(:=) in hibernate native query?
这是在 MySql Workbench 中工作的原始 sql 查询:
SELECT Rank, Value
FROM (SELECT @r := @r+1 AS Rank, z.*
FROM(SELECT MemberId, Value
FROM (SELECT Id, MemberId, Value, CreatedDate, EventId
FROM Scores
WHERE (LoadTime IS NULL AND EventId = 408)
ORDER BY Value DESC
) AS sub
)z,
(SELECT @r:=0)y
)x
WHERE x.Value<=228000;
408 和 228000 只是示例 - 我的 C# 代码构造字符串,然后通过以下方式将其发送到服务器:
StringBuilder statisticQueryString = new StringBuilder("");
// construct statisticQueryString
using (MySqlCommand cmd = new MySqlCommand(statisticQueryString.ToString(), conn))
{
cmd.Parameters.AddWithValue("r", 0);
using (MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
// Iterate through the collection of RankResult items...
}
}
由于上述语法错误而失败的示例构造查询(我在发送之前将最终查询打印到日志中)是:
SELECT Rank, Value
FROM (SELECT @r := @r+1 AS Rank, z.*
FROM(SELECT MemberId, Value
FROM (SELECT Id, MemberId, Value, CreatedDate, EventId
FROM Scores
WHERE (LoadTime IS NULL AND EventId = 408)
ORDER BY Value DESC
) AS sub
)z,
(SELECT @r:=0)y
)x
WHERE x.Value<=228000;
如您所见,构造的查询与我可以在 MySql 工作台中运行而不会出错的查询相同。
【问题讨论】:
-
我从未尝试在同一个查询中同时使用会话变量和命名参数;如果它甚至被支持,它看起来像是通过浏览您引用的主题,我假设您不想设置会话变量的值,就好像它是一个参数一样。 MySQL 可能看到
0 := 0 + 1 -
我将您的评论解释为变量在 2 个位置声明,因此我删除了 C# 声明并修复了它。谢谢!
-
是的,我就是这个意思。参数在执行查询之前被替换,但您希望保留会话变量的标识符。不幸的是,MySQL 的会话变量恰好与它们共享一种模棱两可的格式。
-
知道了。感谢您的额外解释,我现在对参数替换的工作原理有了更好的了解。
-
对于遇到此问题的其他任何人来说,添加
Allow User Variables=true也是必要的以使其正常工作 - 没有它,将引发异常并显示消息"Parameter '@r' must be defined."
标签: c# mysql .net parameters mysql-connector