C# MySqlException(0x80004005):已经有一个与此连接关联的打开的DataReader,必须先关闭它
我在应用程序中只使用了两次DataReaders,两次都是这样C# MySqlException(0x80004005):已经有一个与此连接关联的打开的DataReader,必须先关闭它,c#,mysql,database,C#,Mysql,Database,我在应用程序中只使用了两次DataReaders,两次都是这样 MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { //Code } reader.Close(); 有人能给我一些关于如何解决这个错误的建议吗?或者去哪里看?抱歉,如果它太模糊,但这就是错误告诉我的。它指出了这一点: MySqlCommand cmdDel = new My
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())有人能对此进行确认吗?您可以在while循环中写入查询,但请确保不应使用外部循环使用的资源。您可以在while循环中写入查询,但请确保不应使用外部循环使用的资源。这几乎肯定意味着您正在共享一个资源多个命令对象之间的连接对象。您应该避免这样做(除非它们都涉及一个数据库事务) 您通常应遵循的模式是:
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
使用(var连接=新的MySqlConnection(“…”)
{
使用(var cmd=newmysqlcommand(“…”,connection))
{
//设置参数/其他设置/根据需要
connection.Open();
cmd.();
//如果是ExecuteReader,请立即处理结果
}
}
//如果是ExecuteScalar,或者是数据集或数据表的填充,现在就使用结果
除非您有特定的需要阻止它,否则您应该更喜欢使用语句在
中包装一次性使用,而不是手动调用Dispose()
,这几乎肯定意味着您在多个命令对象之间共享一个连接对象。您应该避免这样做(除非它们都涉及一个数据库事务)
您通常应遵循的模式是:
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
使用(var连接=新的MySqlConnection(“…”)
{
使用(var cmd=newmysqlcommand(“…”,connection))
{
//设置参数/其他设置/根据需要
connection.Open();
cmd.();
//如果是ExecuteReader,请立即处理结果
}
}
//如果是ExecuteScalar,或者是数据集或数据表的填充,现在就使用结果
除非您有特定的需要阻止它,否则您应该更喜欢使用
语句在中包装一次性用品,而不是手动调用Dispose()
如果您想同时打开一些读卡器,那么您应该为每个读卡器打开一些新的连接。创建的连接可以在读卡器关闭后再次使用。如果要同时打开一些读卡器,则应为每个读卡器打开一些新连接。创建的连接可以在读卡器关闭后再次使用