1

因此,@whatever 在 SQL 命令字符串中的存在给了我一个致命错误(在命令执行期间遇到了致命错误。)但当我在 MySQL 查询浏览器中执行相同的查询时却没有。

这是一个简单的示例,我为表中的每个 John 提供了一个行号,并在 datagridview 中显示它们:

private void button1_Click(object sender, EventArgs e)
{
   _dataTable.Clear();

   try
   {
      _conn = new MySqlConnection(Cs);
      _conn.Open();

      string name = "john";
      //This is the string that gives me an error
      string ConnString = "SELECT name,lastname,(@Row := @Row + 1) AS RowNumber FROM person JOIN (SELECT @Row := 0) r WHERE name = '"+name+"'";

      //This one doesn't gives an error
      //string ConnString = "SELECT name,lastname FROM person WHERE name = '" + name + "'";

      _cmd = new MySqlCommand
      {
         Connection = _conn,
         CommandText = ConnString
      };

      _cmd.ExecuteNonQuery();

      _da = new MySqlDataAdapter(_cmd);
      _da.Fill(_dataTable);

      _cb = new MySqlCommandBuilder(_da);

      dataGridView1.DataSource = _dataTable;
      dataGridView1.DataMember = _dataTable.TableName;
      dataGridView1.AutoResizeColumns();

      _conn.Close();
  }   
  catch (Exception ex)
  {
     MessageBox.Show(ex.Message);
  }
  finally
  {
     if (_conn != null) _conn.Close();
  }
}

为什么会发生这种情况,我该如何解决?我已经看到了很多关于此的问题,但没有具体的答案。

4

2 回答 2

1

您不应该构建这样的 SQL 语句。请改用参数。请参阅SQL 注入。例如,

var command = new SqlCommand("SELECT name,lastname,(@Row := @Row + 1) AS" 
                             " RowNumber FROM person JOIN (SELECT @Row := 0)"
                             " r WHERE name = @Name");
SqlParameter param  = new SqlParameter();
param.ParameterName = "@Name";
param.Value         = "John Doe";
command.Parameters.Add(param);

无论如何,这不是连接字符串!

要使用用户定义的参数,您需要设置一个选项。您看到的错误是您的查询有问题,因为 C# 认为您正在尝试将@Row其用作参数。请参阅如何在 .NET MySqlCommand 中使用 MySql 用户定义变量。将此添加到您的连接字符串;Allow User Variables=True。还有一篇关于这个问题的博客文章。

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

我在 5.0 文档中发现了这一点:

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

从这个页面:http ://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqlcommand.html

因此,在 MySQL 中使用参数的@符号@Name可能不起作用,您需要使用?Name参数和@Row用户变量。

例如,

var command = new SqlCommand("SELECT name,lastname,(@Row := @Row + 1) AS" 
                             " RowNumber FROM person JOIN (SELECT @Row := 0)"
                             " r WHERE name = ?Name");
于 2012-12-13T13:03:21.447 回答
-1

您可能需要在查询中声明 @Row。

string command = "DECLARE @Row INT; SELECT name,lastname,(@Row := @Row + 1) AS RowNumber FROM person JOIN (SELECT @Row := 0) r WHERE name = @Name;";

_cmd = new MySqlCommand(_conn);
_cmd.CommandText = command;
_cmd.Parameters.Add("@Name", name);
于 2012-12-13T13:18:23.383 回答