没有任何SELECT(!):“已经有与此连接关联的打开的DataReader”

时间:2018-08-15 07:13:43

标签: c# mysql

我知道有很多问题,例如“已经有一个与此Connection关联的打开的DataReader”(编辑:最初写为“ Command”)-但是在所有情况下都涉及一些SELECT命令。

我的情况不同:在这台计算机上, 不执行SELECT命令 (它们在另一台物理计算机上),仅执行INSERT和UPDATE命令。

那怎么会发生? command.ExecuteNonQuery()command.Prepare()是否仍打开DataReader?那将是一个WTF,但至少是一个解释。

2 个答案:

答案 0 :(得分:2)

在查看了SqlCommandOleDbCommand的参考源之后,它们两个在ExecuteNonQuery方法实现中都有一些快速路径,这些路径会尝试避免打开数据读取器,但是两者都有一个缓慢的路径,这将退回到使用数据读取器的方式(显然,数据读取器的路径必须应付所有可能的选择,并且他们不想重复所有这些代码,并非没有道理)。

我怀疑您用来连接到的哪个选项 1 都会实现相似。因此,首先,不必SELECT引起冲突。

修复程序应该很简单,并且是很好的一般建议。不要共享任何数据库对象。当然,您的连接字符串有一个来源,但是,通常,如果您需要连接对象,请先在其上new,然后在using语句中使用它。命令对象相同。对于读者而言,您不会new自己动手,但是您仍然想要using

如果不重用数据库对象,则永远不会出现此错误。唯一的例外(在我的书中)是,如果您要使用客户端控制的事务(例如TransactionScope或类似事务)来共享连接对象。但是您仍然不需要共享命令对象。而且,如果事务范围如此之广,以至于您丢失了对其执行的所有命令的跟踪,那么我建议它太大了。


1 上次我看到IDbConnection等层次结构中有几个竞争的特定实现,加上OleDbCommand和family都可以使用

答案 1 :(得分:0)

基于Bradley Grainger的评论(MySqlConnection的线程安全性问题),我可以通过确保没有并行运行查询来摆脱该问题。

这意味着原始异常消息可能是错误的(不能排除Damien_The_Unbeliever的答案中提到的某些奇怪路径)。