Как лучше всего справиться с попыткой получить данные из DataReader, у которого более одного столбца с одинаковым именем?
Из-за объема работы и из-за того, что мы не хотим терять поддержку со стороны поставщика, изменяя хранимые процедуры, которые мы используем для получения данных, я пытаюсь найти другой способ получить доступ к столбцу, который показывает больше чем один раз в устройстве чтения данных без необходимости переписывать хранимые процедуры.
Любые идеи?
Обновлено: Хорошо, функция, которая фактически заполняется из устройства чтения данных, используется в нескольких местах, поэтому существует вероятность того, что функция может вызываться разными хранимыми процедурами. Я сделал GetName, используя индекс, чтобы проверить, правильный ли это столбец, и если да, то вытащить его значение.





Разве вы не можете использовать порядковые номера столбцов? 0 для 1-го, 1 для 2-го и так далее?
Если вы знаете индекс столбца, то обращайтесь к нему по индексу.
Вам нужно будет ссылаться на столбец по номеру индекса; т.е. считыватель [5] .ToString (); для чтения данных в столбце 5.
Основываясь на подходе оригинального плаката, описанном в параграфе «Редактировать», вот метод расширения, который даст значение на основе имени столбца и индекса этого имени, например, 0 для первого экземпляра имени, 1 для второго и т. д. :
using System;
namespace WhateverProject {
internal static class Extentions {
// If a query returns MULTIPLE columns with the SAME name, this allows us to get the Nth value of a given name.
public static object NamedValue(this System.Data.IDataRecord reader, string name, int index) {
if (string.IsNullOrWhiteSpace(name)) return null;
if (reader == null) return null;
var foundIndex = 0;
for (var i = 0; i < reader.FieldCount; i++) {
if (!reader.GetName(i).Equals(name, StringComparison.CurrentCultureIgnoreCase)) continue;
if (index == foundIndex) return reader[i];
foundIndex++;
}
return false;
}
}
}
Используйте это так:
var value1 = reader.NamedValue("duplicatedColumnName", 0);
var value2 = reader.NamedValue("duplicatedColumnName", 1);