我正在尝试执行当前在phpMyAdmin中运行的查询,但是在使用MySqlAdapter在.NET中执行它时它不起作用。这是Sql语句。
SELECT @rownum := @rownum +1 rownum, t . *
FROM (
SELECT @rownum :=0
) r, (
SELECT DISTINCT
TYPE FROM `node`
WHERE TYPE NOT IN ('ad', 'chatroom')
)t
它使用@rownum对从内部标量查询返回的每个不同行进行编号。但是,如果我在.NET中使用它,它假设@rownum是一个参数并抛出异常,因为我没有定义它。
using (var sqlConnection = new MySqlConnection(SOURCE_CONNECTION))
{
sqlConnection.Open();
MySqlDataAdapter sqlAdapter = new MySqlDataAdapter(SqlStatement, sqlConnection);
DataTable table = new DataTable();
sqlAdapter.Fill(table);
sqlConnection.Close();
return table;
}
关于如何解决这个问题的任何想法?或者我可以通过哪种方式获得行号?
答案 0 :(得分:37)
我发现这个blog,告诉我们,对于更新版本的.net连接器,你必须添加
;Allow User Variables=True
到连接字符串。 比较我的问题How can I use a MySql User Defined Variable in a .NET MySqlCommand?
答案 1 :(得分:3)
您使用的是什么版本的MySQL数据提供程序?您可能需要更新。
中找到了这个提供程序的早期版本使用“@”符号标记SQL中的参数。这与MySQL用户变量不兼容,因此提供程序现在使用'?'用于在SQL中查找参数的符号。要支持旧代码,可以在连接字符串上设置“old syntax = yes”。如果这样做,请注意,如果您未能定义要在SQL中使用的参数,则不会抛出异常。
答案 2 :(得分:1)
您可以在表中添加一个名为rownum的列,然后使用值填充它:
table.Columns.Add("rownum");
for (int i=0; i < table.Rows.Count; i++)
{
table.Rows[i]["rownum"] = i;
}