DataReader + MySql Connector + Dispose

4
我遇到的问题只在最新版本的MySQL Connector .Net (截至目前为止是6.10) 上出现。
长期以来,我在MSSQL和MYSQL中都正确执行以下操作:
1. 创建DbConnection 2. 使用前一个连接创建DbCommand 3. 执行 4. 获取DbDataReader 5. 释放DbCommand,而不是连接(因为它是一个包装类) 6. 从DbDataReader读取数据
所有这些在MSSQL和MYSQL v6.9中都可以正常工作(甚至SQLite也可以,因为包装类将其处理)。
现在,在MySQL Connector 6.10中,当DbCommand被Dispose时,DataReader会关闭。
我的问题是:是否有人能确认这种行为将保留还是可能在未来被撤销?
在高级别上,拥有不同的DB提供程序表现得有点奇怪。
我意识到这可能更好地在MySQL Developer Zone上询问,但我没有帐户,也许我需要创建一个。
谢谢。

这确实很糟糕。我遇到了同样的问题,并在此处提交了错误报告:https://bugs.mysql.com/bug.php?id=89159。 - Timo
1个回答

5
这绝对是 MySql.Data 6.10 中的一项变更:https://github.com/mysql/mysql-connector-net/commit/ae13ac2dc3fd0da24c158b9a40a6e3362d27f05b 我按照您的步骤添加了一个测试(代码在本回答末尾),并在多个提供程序上运行了 AdoNet.Specification.Tests。以下连接器都可以很好地处理它:

以下两个失败了:

我认为这是 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。 谢谢。 - MaxSantos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接