2

ここに問題があります。私が何をしているように見えても、MySqlCommand を実際に準備することはできません。http://dev.mysql.com/doc/refman/5.6/en/connector-net-programming-prepared.htmlからサンプル コードをコピーして貼り付けてみましたが、実際には機能しません。 .

私は解決策を見つけるためにGoogleを探しましたが、出てきた最も近いものは、実際には質問に答えなかったMySql statement prepare "not sticking"でした。

このテスト用のテーブル設定は次のとおりです。

CREATE  TABLE `test`.`test_prepared_query` (
  `id` INT NOT NULL ,
  `value` INT NOT NULL ,
  PRIMARY KEY (`id`) );

C# でのテスト コード

public void TestPrepareQuery()
{
    connString = new MySqlConnectionStringBuilder();
    connString.Server = "localhost";
    connString.Database = "test";
    connString.UserID = "someuserid";
    connString.Password = "somepassword";

    bool isprepared;

    using (MySqlConnection conn = new MySqlConnection(connString.ToString()))
    {
        MySqlCommand cmd = new MySqlCommand(
            "INSERT INTO test_prepared_query VALUES (@id, @value)", conn);
        cmd.Connection.Open();

        cmd.Prepare();
        isprepared = cmd.IsPrepared; // isprepared is false here

        cmd.Parameters.AddWithValue("@id", 0);
        cmd.Parameters.AddWithValue("@value", 0);

        cmd.Prepare();
        isprepared = cmd.IsPrepared; // isprepared is still false

        // this is 1 -- the query succeeds
        int rowsAffected = cmd.ExecuteNonQuery();

        for (int i = 1; i < 10; i++)
        {
            cmd.Parameters["@id"].Value = i;
            cmd.Parameters["@value"].Value = i;

            // this is 1 -- the query succeeds
            rowsAffected = cmd.ExecuteNonQuery();
        }
    }
}

コードを実行すると、テーブルに行が正常に配置されますが、プログラムをステップ実行すると、cmd.IsPrepared の状態が常に false であることが確認されます。なぜこれが起こっているのか誰にも分かりますか?このソース コードは、テーブル名と実際の接続文字列が変更されているだけで、サンプル コードと基本的に同じです。

編集: ?name 形式の変数を試しましたが、どちらも機能しません。また、テストで一度に 1 つの cmd.Prepare() メソッドのみを呼び出すようにしました。

4

1 に答える 1

5

最終的に、MySql Connector / .NET のソース コードを調べたところ、MySqlCommand.Connection.Settings.IgnorePrepare = true (これがデフォルトです!) の場合、Prepare の呼び出しはノーオペレーションであることがわかりました。

これを修正するには、接続文字列で IgnorePrepare を明示的に false に設定します。これは、次のコード スニペットを使用して MySqlConnectionStringBuilder で簡単に実行できます。

MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder();
// .. set up the rest of your connection
connBuilder.IgnorePrepare = false;

MySqlConnection conn = new MySqlConnection(connBuilder.ToString());
于 2013-03-31T23:38:45.573 に答える