数据库
首页 > 数据库> > 标签:DataReader MySql Connector Dispose

标签:DataReader MySql Connector Dispose

作者:互联网

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

多年来,我在MSSQL和MYSQL中都能正常工作以下内容:

>创建DbConnection
>使用先前的连接创建DbCommand
>执行
>获取DbDataReader
>处置DbCommand,而不是连接(在此刻完成,因为它是包装器类)
>从DbDataReader读取数据

所有这些在MSSQL和MYSQL v6.9中都可以正常工作(即使是SQLite,因为包装器类也可以处理)

现在,在MySQL Connector 6.10中,当DbCommand被释放时,DataReader被关闭.

我的问题是:任何人都可以确认这种行为是否会持续下去或将来有可能恢复吗?

具有如此高水平的DB提供程序彼此不同的行为有点奇怪.

我意识到在MySQL开发人员专区上问这个问题可能更好,但是我没有帐户,也许我需要创建一个帐户.

谢谢

解决方法:

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

我根据您的步骤(代码在此答案的结尾)向AdoNet.Specification.Tests添加了一个测试,并针对各种提供程序进行了测试.

下列连接器处理得很好:

> dotConnect.Express.for.MySQL v8.10.1031
> MySqlConnector v0.33.1
> MySql.Data v6.9.10
> Microsoft.Data.Sqlite v2.0.0
> System.Data.SQLite v1.0.106
> System.Data.SqlClient v4.4.2

以下两个失败:

> MySql.Data v6.10.5
> MySql.Data v8.0.9-dmr

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

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

重现故障的样本测试代码:

[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());
    }
}

标签:datareader,connector,c,mysql
来源: https://codeday.me/bug/20191025/1929088.html