首页 > 解决方案 > MySqlDataReader.GetSchemaTable ColumnOrdinal 是实际数据的 +1

问题描述

我正在尝试使用序数值从 a 的每一行中提取数据,MySqlDataReader而不是使用字符串查找。为了做到这一点,我使用GetSchemaTable读者提供的数据表来循环填写一个字典,该字典使用列名作为键,序号作为值。但是,数据表中的值是阅读器中列的实际位置的 +1。

示例:我有一个 sql 语句,它返回带有模式的记录 -

EventID, StreamUrl, CreatedStamp, ModifiedStamp

GetSchemaTable()方法MySqlDataReader是将这些列映射为 -

EventID = 1, StreamUrl = 2, CreatedStamp = 3, ModifiedStamp = 4

但是数据阅读器呈现数据的方式是 -

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在其他项目中使用过这个确切的代码并且没有看到这种情况发生。为什么架构表的序数值和读者的实际序数值不匹配?

编辑: MySQLConnector 版本 - 8.0.11 来自 NuGet .Net 版本 - 4.6.1

标签: c#mysqlmysql-connector

解决方案


这是 MySQL Connector/NET 中的一个已知错误:错误 61477。根据该错误报告,由于向后兼容性问题,它不太可能被更改。

如果您坚持使用 Connector/NET,则只需手动从序数值中减去 1。否则,您可以切换到MySqlConnector,它修复了这个错误


推荐阅读