标签: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