【问题标题】:MySqlCommand Prepare() never sets IsPrepared to trueMySqlCommand Prepare() 从不将 IsPrepared 设置为 true
【发布时间】:2013-03-29 01:03:03
【问题描述】:

问题是:无论我做什么,我都无法让 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 格式的变量,但这也不起作用。我也试过在测试中一次只调用一个 cmd.Prepare() 方法。

【问题讨论】:

    标签: c# mysql


    【解决方案1】:

    我最终调出了 MySql Connector / .NET 的源代码,发现如果 MySqlCommand.Connection.Settings.IgnorePrepare = true(这是默认值!),那么调用 Prepare 是无操作的。

    解决此问题的方法是在连接字符串中将 IgnorePrepare 显式设置为 false。这可以通过 MySqlConnectionStringBuilder 使用以下代码 sn-p 轻松完成:

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

    【讨论】:

    • 太棒了,我前段时间遇到过这个问题,但一直不知道如何解决。
    • 很高兴它帮助了其他人。我不敢相信这是多么棘手,因为我怀疑它会影响大多数第一次使用准备好的语句的人。
    • 您的回答仍在全球范围内解决头痛问题。昨天在这上面浪费了大约 3 个小时!
    • 也感谢我! ——我希望我能更多地了解原因。默认情况下关闭似乎是一个愚蠢的功能。在我看来,准备手册应该描述这一点——我不会查看源代码!后来我确实在连接字符串手册中找到了它。
    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2021-12-19
    • 2011-05-26
    相关资源
    最近更新 更多