不带任何选择(!):“已存在与此连接关联的打开的datareader“

dwbf0jvd  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(260)

我知道关于“已经有一个与此连接相关联的开放数据读取器”(编辑:最初编写的“command”)有很多问题,但在所有情况下都涉及到一些select命令。
我的情况不同:在这台机器上,不执行select命令(它们在不同的物理计算机上),只执行insert和update命令。
怎么会这样?做一个 command.ExecuteNonQuery() 或者 command.Prepare() 打开数据阅读器?这将是一个世界跆拳道联合会,但至少是一个解释。

6jjcrrmo

6jjcrrmo1#

审查了参考源 SqlCommand 以及 OleDbCommand ,它们都有一些快速路径 ExecuteNonQuery 方法实现将尝试避免打开一个数据读取器,但两者都有一个缓慢的路径,这将回落到使用一个数据读取器(显然,数据读取器路径必须处理所有可能的选项,他们不想重复所有的代码,不是不合理的)。
我怀疑,无论您使用哪个选项1连接到mysql,都会有类似的实现。所以,首先也是最重要的是,它不必是 SELECT 这是冲突的起因。
不过,修复方法应该很简单,是一个很好的一般建议。不共享任何数据库对象。当然,连接字符串只有一个源,但是,一般来说,如果需要连接对象, new 把它放在那里然后用在 using 声明。命令对象也是如此。对于读者来说,你不会 new 但你还是想要 using .
如果不重用数据库对象,就永远不会出现此错误。唯一的例外(在我的书中)是如果您使用的是客户机控制的事务(例如。 TransactionScope 或者类似的)共享连接对象。但您仍然不需要共享命令对象。如果事务范围太广,以至于您无法跟踪对其执行的所有命令,我建议它太大了。
1上一次我查看时,有两个与mysql相关的 IDbConnection 等人,加上 OleDbCommand 家庭也可以用。

nvbavucw

nvbavucw2#

根据bradley grainger的评论(mysqlconnection的线程安全问题),我可以通过确保没有并行运行的查询来解决这个问题。
这意味着原始异常消息可能是错误的(不能排除damien\u中提到的一些奇怪的路径不信者的答案)。

相关问题