mysqldatareader.getschematable columnordinal是实际数据的+1

vnzz0bqm  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(237)

我尝试使用序数值从 MySqlDataReader 而不是使用字符串查找。为了做到这一点,我使用 GetSchemaTable 它可以从读取器获得一个数据表来循环,以填写一个使用列名作为键、序数作为值的字典。但是,数据表中的值是读卡器中列的实际位置的+1。
示例:我有一个sql语句,它返回带有模式的记录-

EventID, StreamUrl, CreatedStamp, ModifiedStamp

这个 GetSchemaTable() 方法从 MySqlDataReader 正在将这些列Map为-

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

rsaldnfx

rsaldnfx1#

这是mysql connector/net中的一个已知错误:错误61477。根据那个bug报告,由于向后兼容性的考虑,它不太可能被更改。
如果您坚持使用connector/net,您只需手动从序数值中减去一即可。否则,您可以切换到mysqlconnector,它修复了这个bug。

相关问题