DataReader с повторяющимися именами столбцов

Каков наилучший способ обработки данных из DataReader с несколькими столбцами с одинаковыми именами?

Из-за большого объема работы и из-за того, что мы не хотим потерять поддержку со стороны поставщика путем изменения хранимых процедур, которые мы используем для извлечения данных, я пытаюсь найти другой способ получить доступ к столбцу, который показывает больше чем один раз в хранилище данных без необходимости переписывать хранимые процедуры.

Любые идеи?

РЕДАКТИРОВАТЬ: Хорошо, функция, которая на самом деле заполняет из хранилища данных, используется в нескольких местах, так что есть вероятность, что функция может быть вызвана различными хранимыми процедурами. Я сделал GetName, используя индекс, чтобы проверить, является ли он правильным столбцом, и если это так, то извлеките его значение.

10.12.2008 22:37:35
4 ОТВЕТА
РЕШЕНИЕ

Если вы знаете индекс столбца, то получите к нему доступ по индексу.

3
10.12.2008 22:40:00

Разве вы не можете использовать порядковые номера столбцов? 0 для 1-го, 1 для 2-го и так далее?

1
10.12.2008 22:39:40

Вам придется ссылаться на столбец по индексу №; то есть читатель [5] .ToString (); прочитать данные в столбце 5.

1
10.12.2008 22:40:02

Основанный на оригинальном подходе автора, описанном в параграфе «Редактировать», вот метод расширения, который даст значение на основе имени столбца и индекса этого имени, например, 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);
0
21.11.2019 14:37:48