【问题标题】:MySqlDataReader doesn't close after calling Close() on the reader在阅读器上调用 Close() 后 MySqlDataReader 未关闭
【发布时间】:2017-09-25 14:47:42
【问题描述】:

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

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

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

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

UPD:周围有任务,但只能在主线程中使用阅读器。另外,reader 被声明为DbDataReaderMySqlDataReader 是从那里继承而来的。

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

【问题讨论】:

  • 你在异步任务中吗??
  • @apomene 不,在任务之外,正常的单线程代码。周围有一些任务,但它们不处理阅读器,只处理从阅读器获取的数据。
  • 如果你打电话给reader.Dispose()会发生什么?它会被处理掉吗?
  • @waka 没有任何反应。但是,如果我这样做:((MySql.Data.MySqlClient.MySqlDataReader)reader).Close(),那么它可以工作。 reader 在我的代码中被声明为 DbDataReader

标签: mysql .net .net-core mysql-connector mysqldatareader


【解决方案1】:

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

【讨论】:

  • MySqlDataReader 实现中有一个错误,它们没有覆盖该方法,因此虚拟调用解析为 DbDatReader 的空实现。
  • 我刚刚注意到您谈到使用 v6.x,因为只有标准支持。我目前正在使用 8.0.8-dmr,它工作正常。如果您想尝试,还有一个更新的版本
  • 即使在阅读了文档之后,我仍然不明白 6.x 和 8.x 连接器之间的区别。
  • 我创建了这个名为 mysql.simple 的 nuget,从那以后我一直在使用它。 nuget.org/packages/MySql.Simple 它包含我最初用来处理此类问题的包装类。现在它也有许多其他的辅助功能。您总是可以从中拉出 mysqlreader 对象。我不会有太多的工作,你可以试试。您不应该遇到任何关闭问题
【解决方案2】:

我建议做的不仅仅是添加 using 语句,因为正如我刚刚目睹的那样,异常仍然会让阅读器保持打开状态。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多