DataReader + MySql 连接器 + 处理
DataReader + MySql Connector + Dispose
我遇到的问题仅在最新版本的 MySQL Connector .Net(目前为 6.10)
多年来,我在 MSSQL 和 MYSQL 中都可以正常工作:
- 创建 DbConnection
- 使用之前的连接创建 DbCommand
- 执行
- 获取 DbDataReader
- 处理 DbCommand,而不是连接(此时完成,因为它是一个包装器 class)
- 从 DbDataReader 读取数据
所有这些都在 MSSQL 和 MYSQL v6.9 中正常工作(甚至是 SQLite,因为包装器 class 处理它)
现在,使用 MySQL 连接器 6.10,当 DbCommand 被处置时,DataReader 被关闭。
我的问题是:任何人都可以确认这种行为会一直存在还是将来可能会恢复?
数据库提供者在如此高的水平上彼此行为不同,这有点奇怪。
我知道在 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/. Alternatively, consider switching to 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());
}
}
我遇到的问题仅在最新版本的 MySQL Connector .Net(目前为 6.10)
多年来,我在 MSSQL 和 MYSQL 中都可以正常工作:
- 创建 DbConnection
- 使用之前的连接创建 DbCommand
- 执行
- 获取 DbDataReader
- 处理 DbCommand,而不是连接(此时完成,因为它是一个包装器 class)
- 从 DbDataReader 读取数据
所有这些都在 MSSQL 和 MYSQL v6.9 中正常工作(甚至是 SQLite,因为包装器 class 处理它)
现在,使用 MySQL 连接器 6.10,当 DbCommand 被处置时,DataReader 被关闭。
我的问题是:任何人都可以确认这种行为会一直存在还是将来可能会恢复?
数据库提供者在如此高的水平上彼此行为不同,这有点奇怪。
我知道在 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/. Alternatively, consider switching to 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());
}
}