Я пытаюсь использовать порядковое значение для извлечения данных из каждой строки 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
Да, это именно то, что я вижу. Похоже, что процесс проверки кода для запроса на вытягивание в значительной степени не удался. Спасибо за пояснение, что код написали две разные команды. Я могу передать его обратно в IDatabaseReader и посмотреть, решит ли он проблему.
Простая гипсовая повязка этого не исправит. Это реализация, а не тип. Я написал код, который использовал таблицу схемы загрузчика данных и некоторую рефлексию для создания сопоставителя ORM. Я закончил тем, что сделал специальный корпус, основанный на базовом типе устройства чтения данных (хотя это было не совсем так). Ниже я вижу, что это известная ошибка. К сожалению, исправление было бы критическим изменением (подумайте об этом). Не задерживайте дыхание в ожидании исправления. Удачи!





Это известная ошибка в MySQL Connector / NET: ошибка 61477. Согласно этому отчету об ошибке, вряд ли он будет изменен из-за проблем с обратной совместимостью.
Если вы придерживаетесь Connector / NET, вам просто нужно вручную вычесть единицу из порядкового номера. В противном случае вы можете переключиться на MySqlConnector, который исправляет эту ошибку.
Вы хотите сказать, что если вы посмотрите таблицу, полученную в результате SqlDataReader.GetSchemaTable () и MySqlDataReader.GetSchemaTable (), порядковые номера столбцов будут отличаться друг от друга? Почему-то меня это не удивляет. Существуют различия между SqlDataReader.GetSchemaTable () и тем, что вы просто подключаете DataReader к некоторым данным в памяти (но не в этой единичной проблеме). Этот код был написан двумя разными командами, принадлежащими двум участникам. Одна команда думала, что 0, 1, 2 имеют большой смысл (поскольку они будут использоваться в C#), а другая думала, что 1, 2, 3 имели смысл, ну, потому что ...