c# - 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
解决方案
这是 MySQL Connector/NET 中的一个已知错误:错误 61477。根据该错误报告,由于向后兼容性问题,它不太可能被更改。
如果您坚持使用 Connector/NET,则只需手动从序数值中减去 1。否则,您可以切换到MySqlConnector,它修复了这个错误。
推荐阅读
- c++ - 元组类模板的反向内存布局
- r - How to install and load dplyr without errors?
- javascript - Filling input forms with javascript (document.getElementsByTagName("input")[i].value="2") then submitting but sumbit not working
- laravel - Laravel 分页结果转换
- c++ - what is the real type of auto in c++ struct binding
- excel - Find the top 3 items in an array, with priority given to those higher on a list in the event of tie
- python - 通过从组数据集中旋转数组来计算持续时间
- winforms - netcore31 error with devexpress with winform
- eslint - 如何创建 Eslint 规则以仅验证资本常量变量
- c - 在C中将二进制数组转换为十进制和十六进制