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

时间:2012-04-28 10:23:14

标签: c# mysql database

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

    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.Read())任何人都可以在此确认吗?

3 个答案:

答案 0 :(得分:3)

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

您应该遵循的模型一般是:

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()

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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