是否可以在 .NET MySqlCommand 中使用 MySql 用户定义变量?

Posted

技术标签:

【中文标题】是否可以在 .NET MySqlCommand 中使用 MySql 用户定义变量?【英文标题】:Is it possible to use a MySql User Defined Variable in a .NET MySqlCommand? 【发布时间】:2010-10-31 19:57:48 【问题描述】:

我正在尝试执行当前在 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;

关于如何解决这个问题的任何想法?或者可能的方式让我得到一个行号?

【问题讨论】:

【参考方案1】:

您使用的是什么版本的 MySQL 数据提供程序?您可能需要更新。

我在5.0 documentation 中找到了这个:

提供程序的早期版本使用“@”符号来标记 SQL 中的参数。这与 MySQL 用户变量不兼容,因此提供程序现在使用“?”用于在 SQL 中定位参数的符号。要支持旧代码,您可以在连接字符串上设置 'old syntax=yes'。如果您这样做,请注意,如果您未能定义您打算在 SQL 中使用的参数,则不会引发异常。

【讨论】:

感谢您的更新。我也在文档中看到了这一点。这是一个相当新的版本,因为它是在几周前下载的。我尝试了旧的 syntax=yes,但行为没有改变。 链接现在似乎已失效。【参考方案2】:

我发现了这个blog,它告诉你,对于较新版本的 .net 连接器,您必须添加

;Allow User Variables=True

到连接字符串。 比较我的 SO 问题How can I use a MySql User Defined Variable in a .NET MySqlCommand?

【讨论】:

【参考方案3】:

您可以在表中添加一个名为 rownum 的列,然后用值填充它:

table.Columns.Add("rownum");
for (int i=0; i < table.Rows.Count; i++)

table.Rows[i]["rownum"] = i;

【讨论】:

老实说,我会回避以这种方式手动生成数字,但我认为这是一种可能的解决方案。我认为我真的需要重新考虑我提取数据的方式。

以上是关于是否可以在 .NET MySqlCommand 中使用 MySql 用户定义变量?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MySqlCommand 在一个查询中进行多个 INSERT

.NET MySqlTransactions 是不是在本地进行批处理/缓冲?

在一个查询中使用 MySqlCommand 将多条记录插入 MySQL C# (MySQLConnector) & command 转义引号的参数

如何设置两个连接字符串 MySqlCommand 对象参数?

MySqlCommand Command.Parameters.Add 已过时

使用 MySqlCommand 执行存储过程时出现 SqlNullValueException