0

我不太确定我是否遇到了错误,或者我不明白它应该如何工作。所以最近我一直在尝试解决这个异常MySql.Data.MySqlClient.MySqlException: 'There is already an open DataReader associated with this Connection which must be closed first.',我开始了一个调试会话来看看发生了什么。我所看到的并没有完全在我的脑海中计算(见所附截图)。

在我调用 之后reader.Close(),该属性IsClosed保持为假,并且重复调用.Close()(在即时窗口中)不会改变它。

这是预期的行为,我的问题在其他地方,还是这是一个错误和异常的原因?

使用MySql.Datav6.10.3-rc(来自 nuget.org)时会发生这种情况,这是目前唯一支持 .NET Standard 的版本。此外,代码被编译为 .NET Core 2.0 应用程序。

UPD:周围有任务,但只能从主线程使用阅读器。此外,reader被声明为DbDataReader,从中MySqlDataReader继承。

UPD2:显然,如果我打电话((MySql.Data.MySqlClient.MySqlDataReader)reader).Close(),那么阅读器会正确关闭。在我看来,连接器中的错误以及它们如何使用虚拟方法。正确的?

调试器会话

4

2 回答 2

0

我建议做的不仅仅是添加 using 语句,因为我刚刚目睹了一个异常仍然会让读者保持开放。

虽然它确实增加了一些开销,但除非您可以 100% 确定您不会有错误或一些不良数据(例如美妙的空异常错误),否则请使用异常处理。

使用简单的 try/catch 语句并确保阅读器关闭并在异常处理之外声明阅读器,这样即使出现错误,阅读器也会关闭。

于 2020-08-06T10:53:13.457 回答
0

确保您始终在using子句中使用所有读者。我在 using 子句中使用每个阅读器和连接对象,并且没有注意到任何错误或没有关闭。我看不出该using条款可能会出现很多问题。

于 2017-10-15T03:11:48.923 回答