MySqlDataReader.GetSchemaTable ColumnOrdinal 是实际数据的+1
MySqlDataReader.GetSchemaTable ColumnOrdinal is +1 of the actual data
我正在尝试使用序数值从 MySqlDataReader
的每一行中提取数据,而不是使用字符串查找。为了做到这一点,我使用 reader 中可用的 GetSchemaTable
来获取数据 table 以循环遍历以填充使用列名作为键的字典和序号作为值。但是,数据 table 中的值是 reader 中列的实际位置的 +1。
示例:
我有一个 sql 声明 returns 记录模式 -
EventID, StreamUrl, CreatedStamp, ModifiedStamp
MySqlDataReader
中的 GetSchemaTable()
方法将这些列映射为 -
EventID = 1, StreamUrl = 2, CreatedStamp = 3, ModifiedStamp = 4
但是数据 reader 呈现数据的方式是 -
EventID = 0, StreamUrl = 1, CreatedStamp = 2, ModifiedStamp = 3
代码:
Dictionary<string, int> _columns = new Dictionary<string, int>(35, StringComparer.CurrentCultureIgnoreCase);
DataTable _dt = _reader.GetSchemaTable();
foreach (DataRow _row in _dt.Rows)
{
_columns.Add((string)_row["ColumnName"], (int)_row["ColumnOrdinal"]);
}
我在其他项目中针对 IDataReader
使用了这个确切的代码,但没有看到这种情况发生。为什么架构 table 的序数值与 reader 的实际序数值不匹配?
编辑:
MySQLConnector 版本 - 来自 NuGet 的 8.0.11
.Net 版本 - 4.6.1
这是 MySQL Connector/NET 中的已知错误:bug 61477。根据该错误报告,由于向后兼容性问题,它不太可能被更改。
如果您坚持使用 Connector/NET,您只需手动从序数值中减去 1。否则,您可以切换到 MySqlConnector, which fixes this bug.
我正在尝试使用序数值从 MySqlDataReader
的每一行中提取数据,而不是使用字符串查找。为了做到这一点,我使用 reader 中可用的 GetSchemaTable
来获取数据 table 以循环遍历以填充使用列名作为键的字典和序号作为值。但是,数据 table 中的值是 reader 中列的实际位置的 +1。
示例: 我有一个 sql 声明 returns 记录模式 -
EventID, StreamUrl, CreatedStamp, ModifiedStamp
MySqlDataReader
中的 GetSchemaTable()
方法将这些列映射为 -
EventID = 1, StreamUrl = 2, CreatedStamp = 3, ModifiedStamp = 4
但是数据 reader 呈现数据的方式是 -
EventID = 0, StreamUrl = 1, CreatedStamp = 2, ModifiedStamp = 3
代码:
Dictionary<string, int> _columns = new Dictionary<string, int>(35, StringComparer.CurrentCultureIgnoreCase);
DataTable _dt = _reader.GetSchemaTable();
foreach (DataRow _row in _dt.Rows)
{
_columns.Add((string)_row["ColumnName"], (int)_row["ColumnOrdinal"]);
}
我在其他项目中针对 IDataReader
使用了这个确切的代码,但没有看到这种情况发生。为什么架构 table 的序数值与 reader 的实际序数值不匹配?
编辑: MySQLConnector 版本 - 来自 NuGet 的 8.0.11 .Net 版本 - 4.6.1
这是 MySQL Connector/NET 中的已知错误:bug 61477。根据该错误报告,由于向后兼容性问题,它不太可能被更改。
如果您坚持使用 Connector/NET,您只需手动从序数值中减去 1。否则,您可以切换到 MySqlConnector, which fixes this bug.