我知道关于“已经有一个与此连接相关联的开放数据读取器”(编辑:最初编写的“command”)有很多问题,但在所有情况下都涉及到一些select命令。我的情况不同:在这台机器上,不执行select命令(它们在不同的物理计算机上),只执行insert和update命令。怎么会这样?做一个 command.ExecuteNonQuery() 或者 command.Prepare() 打开数据阅读器?这将是一个世界跆拳道联合会,但至少是一个解释。
command.ExecuteNonQuery()
command.Prepare()
6jjcrrmo1#
审查了参考源 SqlCommand 以及 OleDbCommand ,它们都有一些快速路径 ExecuteNonQuery 方法实现将尝试避免打开一个数据读取器,但两者都有一个缓慢的路径,这将回落到使用一个数据读取器(显然,数据读取器路径必须处理所有可能的选项,他们不想重复所有的代码,不是不合理的)。我怀疑,无论您使用哪个选项1连接到mysql,都会有类似的实现。所以,首先也是最重要的是,它不必是 SELECT 这是冲突的起因。不过,修复方法应该很简单,是一个很好的一般建议。不共享任何数据库对象。当然,连接字符串只有一个源,但是,一般来说,如果需要连接对象, new 把它放在那里然后用在 using 声明。命令对象也是如此。对于读者来说,你不会 new 但你还是想要 using .如果不重用数据库对象,就永远不会出现此错误。唯一的例外(在我的书中)是如果您使用的是客户机控制的事务(例如。 TransactionScope 或者类似的)共享连接对象。但您仍然不需要共享命令对象。如果事务范围太广,以至于您无法跟踪对其执行的所有命令,我建议它太大了。1上一次我查看时,有两个与mysql相关的 IDbConnection 等人,加上 OleDbCommand 家庭也可以用。
SqlCommand
OleDbCommand
ExecuteNonQuery
SELECT
new
using
TransactionScope
IDbConnection
nvbavucw2#
根据bradley grainger的评论(mysqlconnection的线程安全问题),我可以通过确保没有并行运行的查询来解决这个问题。这意味着原始异常消息可能是错误的(不能排除damien\u中提到的一些奇怪的路径不信者的答案)。
2条答案
按热度按时间6jjcrrmo1#
审查了参考源
SqlCommand
以及OleDbCommand
,它们都有一些快速路径ExecuteNonQuery
方法实现将尝试避免打开一个数据读取器,但两者都有一个缓慢的路径,这将回落到使用一个数据读取器(显然,数据读取器路径必须处理所有可能的选项,他们不想重复所有的代码,不是不合理的)。我怀疑,无论您使用哪个选项1连接到mysql,都会有类似的实现。所以,首先也是最重要的是,它不必是
SELECT
这是冲突的起因。不过,修复方法应该很简单,是一个很好的一般建议。不共享任何数据库对象。当然,连接字符串只有一个源,但是,一般来说,如果需要连接对象,
new
把它放在那里然后用在using
声明。命令对象也是如此。对于读者来说,你不会new
但你还是想要using
.如果不重用数据库对象,就永远不会出现此错误。唯一的例外(在我的书中)是如果您使用的是客户机控制的事务(例如。
TransactionScope
或者类似的)共享连接对象。但您仍然不需要共享命令对象。如果事务范围太广,以至于您无法跟踪对其执行的所有命令,我建议它太大了。1上一次我查看时,有两个与mysql相关的
IDbConnection
等人,加上OleDbCommand
家庭也可以用。nvbavucw2#
根据bradley grainger的评论(mysqlconnection的线程安全问题),我可以通过确保没有并行运行的查询来解决这个问题。
这意味着原始异常消息可能是错误的(不能排除damien\u中提到的一些奇怪的路径不信者的答案)。