MySqlDataReader.GetSchemaTable ColumnOrdinal - это +1 фактических данных

Я пытаюсь использовать порядковое значение для извлечения данных из каждой строки 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

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

Flydog57 10.07.2018 01:00

Да, это именно то, что я вижу. Похоже, что процесс проверки кода для запроса на вытягивание в значительной степени не удался. Спасибо за пояснение, что код написали две разные команды. Я могу передать его обратно в IDatabaseReader и посмотреть, решит ли он проблему.

Aaron 10.07.2018 01:41

Простая гипсовая повязка этого не исправит. Это реализация, а не тип. Я написал код, который использовал таблицу схемы загрузчика данных и некоторую рефлексию для создания сопоставителя ORM. Я закончил тем, что сделал специальный корпус, основанный на базовом типе устройства чтения данных (хотя это было не совсем так). Ниже я вижу, что это известная ошибка. К сожалению, исправление было бы критическим изменением (подумайте об этом). Не задерживайте дыхание в ожидании исправления. Удачи!

Flydog57 10.07.2018 16:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
226
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это известная ошибка в MySQL Connector / NET: ошибка 61477. Согласно этому отчету об ошибке, вряд ли он будет изменен из-за проблем с обратной совместимостью.

Если вы придерживаетесь Connector / NET, вам просто нужно вручную вычесть единицу из порядкового номера. В противном случае вы можете переключиться на MySqlConnector, который исправляет эту ошибку.

Другие вопросы по теме