MySqlCommand Prepare()从不将IsPrepared设置为true

Tom*_*ues 2 c# mysql

这就是问题:无论我做什么,我都无法让MySqlCommand真正做好准备.我尝试从http://dev.mysql.com/doc/refman/5.6/en/connector-net-programming-prepared.html复制/粘贴示例代码,只做了很小的修改,但这实际上并不起作用.

我搜索谷歌尝试找到一个解决方案,但最接近的是:MySql语句准备"不坚持",实际上没有回答问题.

这是我测试的表格设置:

CREATE  TABLE `test`.`test_prepared_query` (
  `id` INT NOT NULL ,
  `value` INT NOT NULL ,
  PRIMARY KEY (`id`) );
Run Code Online (Sandbox Code Playgroud)

用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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,它确实成功地将行放入表中,但是逐步执行程序会检查cmd.IsPrepared的状态始终为false.有谁知道为什么会发生这种情况?此源代码与示例代码基本相同,只对表名称和实际连接字符串进行了修改.

编辑:我已尝试使用?name格式的变量,但这也无效.我也试过在测试中一次只调用一个cmd.Prepare()方法.

Tom*_*ues 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());
Run Code Online (Sandbox Code Playgroud)