MySqlException (0x80004005):已经有一个与此连接关联的打开的 DataReader,必须先关闭

本文关键字:DataReader 关联 连接 0x80004005 有一个 MySqlException | 更新日期: 2023-09-27 18:32:26

我在我的应用程序中只使用 DataReader 两次,两次看起来像这样

    MySqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
       //Code
    }
    reader.Close();

谁能给我一些关于如何解决此错误的指示?或者去哪里看?抱歉,如果它太模糊了,但这就是错误告诉我的。它指出了这一点:

        MySqlCommand cmdDel = new MySqlCommand("UPDATE " + _Database + " SET balance=" + balance + ", bitaddress=" + myads + ", lostbalance=" + lostbalance + " WHERE username = '" + username + "'", connection);
        cmdDel.ExecuteNonQuery();
        cmdDel.Dispose();

我的猜测是,在一段时间内可能不允许执行查询命令(reader。阅读()) 任何人都可以确认这一点吗?

MySqlException (0x80004005):已经有一个与此连接关联的打开的 DataReader,必须先关闭

这几乎肯定意味着您在多个命令对象之间共享连接对象。您应该避免这样做(除非它们都涉及单个数据库事务)。

您应该遵循的模型通常是:

using(var connection = new MySqlConnection("..."))
{
   using(var cmd = new MySqlCommand("...",connection))
   {
       //Set up parameters/other settings/as required
       connection.Open();
       cmd.<Whatever ExecuteXXX method you need to use>();
       //If it was ExecuteReader, process the results now
   }
}
//If it was ExecuteScalar, or a fill of a DataSet or DataTable, consume the results now

除非您有特定的需要阻止它,否则您应该更愿意将一次性物品包装在 using 语句中,而不是手动调用 Dispose()

您可以在 while 循环中编写查询,但请确保不应使用外部循环使用的资源。

如果你想同时打开一些阅读器,那么你应该为每个阅读器打开一些新的连接。创建的连接可以在读取器关闭后再次使用。

相关文章: