1

したがって、SQLコマンド文字列に@whateverが含まれていると、致命的なエラー(コマンドの実行中に発生した致命的なエラー)が発生しますが、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あります。.NETMySqlCommandでMySqlユーザー定義変数を使用する方法を参照してください。これを接続文字列に追加します;Allow User Variables=True。この問題に関するブログ投稿もあります。

また、どのバージョンのMySQLデータプロバイダーを使用していますか?更新が必要な場合があります。

私はこれを5.0のドキュメントで見つけました:

「以前のバージョンのプロバイダーは、SQLのパラメーターをマークするために「@」記号を使用していました。これはMySQLユーザー変数と互換性がないため、プロバイダーは「?」を使用するようになりました。SQLでパラメータを検索するための記号。古いコードをサポートするために、接続文字列に「oldsyntax = 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 に答える