我不确定我是否遇到了错误,或者我不知道它应该如何工作。所以最近我一直试图解决这个异常MySql.Data.MySqlClient.MySqlException: 'There is already an open DataReader associated with this Connection which must be closed first.'
,我开始调试会话以查看发生了什么。我所看到的并没有完全计算在我脑海中(参见附页截图)。
在我致电reader.Close()
之后,属性IsClosed
保持为false,并且重复调用.Close()
(在即时窗口中)不会更改该内容。
这是预期的行为吗?我的问题出在其他地方,或者这是一个错误和异常的原因?
使用MySql.Data
v6.10.3-rc(来自nuget.org)时会发生这种情况,这是迄今为止唯一支持.NET标准的版本。此外,代码编译为.NET Core 2.0应用程序。
UPD :周围有任务,但读者只能使用主线程。此外,reader
被声明为DbDataReader
,从中继承MySqlDataReader
。
UPD2 :显然,如果我拨打((MySql.Data.MySqlClient.MySqlDataReader)reader).Close()
,那么阅读器会正常关闭。在我看来,连接器中的错误以及它们如何使用虚拟方法。正确?
答案 0 :(得分:0)
确保始终在using
子句中使用所有读者。我在using子句中使用每个reader和connection对象,并且没有注意到任何错误或没有关闭。我没有看到using
子句出现问题的方法很多。
答案 1 :(得分:0)
我建议做的事情不只是添加using语句,因为我刚刚目睹到异常仍将使读者保持开放状态。
虽然确实会增加一些开销,但是除非您可以100%确保不会出现错误或某些不良数据(例如奇妙的null异常错误),否则请使用异常处理。
使用简单的try / catch语句,并确保读取器关闭并在异常处理之外声明读取器,以便即使发生错误也可以关闭读取器。