DataReader + MySql 连接器 + Dispose

Posted

技术标签:

【中文标题】DataReader + MySql 连接器 + Dispose【英文标题】:DataReader + MySql Connector + Dispose 【发布时间】:2017-12-12 18:21:02 【问题描述】:

我遇到的问题仅在最新版本的 mysql Connector .Net(目前为 6.10)上表现出来

多年来,我在 MSSQL 和 MYSQL 中都可以正常工作:

    创建数据库连接 使用以前的连接创建 DbCommand 执行 获取 DbDataReader 处理 DbCommand,而不是连接(此时已完成,因为它是一个包装类) 从 DbDataReader 读取数据

所有这些都在 MSSQL 和 MYSQL v6.9 中正常工作(甚至 SQLite,因为包装类处理它)

现在,使用 MySQL 连接器 6.10,当 DbCommand 被释放时,DataReader 被关闭。

我的问题是:任何人都可以确认这种行为会继续存在或将来可能会恢复吗?

在如此高的级别上让 DB 提供者的行为彼此不同,这有点奇怪。

我知道在 MySQL 开发者专区问这个可能更好,但我没有帐户,也许我需要创建一个。

谢谢

【问题讨论】:

这确实很糟糕。我遇到了同样的问题并在这里提交了错误报告:bugs.mysql.com/bug.php?id=89159。 【参考方案1】:

这绝对是 MySql.Data 6.10 的变化:https://github.com/mysql/mysql-connector-net/commit/ae13ac2dc3fd0da24c158b9a40a6e3362d27f05b

我根据您的步骤(代码在此答案的末尾)添加了一个测试到AdoNet.Specification.Tests,并针对各种提供商运行它。

以下连接器处理得很好:

dotConnect.Express.for.MySQLv8.10.1031 MySqlConnectorv0.33.1 MySql.Datav6.9.10 Microsoft.Data.Sqlitev2.0.0 System.Data.SQLitev1.0.106 System.Data.SqlClientv4.4.2

以下两个失败:

MySql.Datav6.10.5 MySql.Datav8.0.9-dmr

我认为这是 MySql.Data 6.10.x 中的回归;不幸的是,提交评论没有提供任何线索来解释为什么这种行为会改变。解决此问题的最佳机会是在https://bugs.mysql.com/ 提交错误报告。或者,考虑切换到 MySqlConnector,这是 MySql.Data 的 OSS 替代品,它修复了许多长期存在的错误,并添加了真正的异步支持。

更新:错误报告已创建:MySQL Bug #89159。

更新 2:此错误应在 Connector/NET 8.0.20 中修复。

重现故障的示例测试代码:

[Fact]
public virtual void Dispose_command_before_reader()

    using (var connection = CreateOpenConnection())
    
        DbDataReader reader;
        using (var command = connection.CreateCommand())
        
            command.CommandText = "SELECT 'test';";
            reader = command.ExecuteReader();
        

        Assert.True(reader.Read());
        Assert.Equal("test", reader.GetString(0));
        Assert.False(reader.Read());
    

【讨论】:

非常感谢您的回复。现在我将不得不保持6.9。因此没有时间重构旧的工作代码。将看看 MySqlConnector。谢谢

以上是关于DataReader + MySql 连接器 + Dispose的主要内容,如果未能解决你的问题,请参考以下文章

DataReader相关知识点

DataTable.Load 显示的行数少于源 DataReader

已经打开的 DataReader 的连接字符串出现问题

“连接必须有效且打开” - DataReader 问题

MysqlException 未处理 DataReader 必须关闭此连接 vb.net

DataReader 循环查询中的 C# MySQL 查询