我有一块代码,每隔约0.25秒执行一次。它在前十次迭代中工作正常,直到它与“已经与此连接相关联的Datareader”错误崩溃,尽管事实上我每次关闭正在使用的数据读取器。请求的速度可能导致这种情况吗?我把它放慢到每1.5秒执行一次,它仍然发生了。这个连接在其他任何地方使用都禁止这个块,所以我不确定它为什么会发生。
MySqlCommand cmd = new MySqlCommand(QueryString, connection);
var dataReader = cmd.ExecuteReader();
var dt = new DataTable();
dt.Load(dataReader);
dataReader.Close();
dataReader.Dispose();
cmd.Dispose();
答案 0 :(得分:0)
最有可能的是,两个操作在某个时刻同时运行。由于您为每个连接使用相同的连接,因此会遇到并发问题 - 默认情况下,一个连接仅支持单个打开的游标。所有需要发生的事情是数据库查询花费的时间超过了计时器间隔。
添加同步以确保两个请求不会同时运行 - 如果已有请求未决,则立即返回。
此外,请务必正确使用using
和try
... finally
- 异常可能会阻止dataReader.Dispose()
运行,从而保持连接在读取器被GC和终结器丢弃之前,无法打开任何新游标。
答案 1 :(得分:0)
为datareader和ExecuteNonQuery使用不同的连接