Я думаю, что вам лучше всего позвонить GetOrdinal ("columnName") на ваш DataReader и поймать исключение IndexOutOfRangeException, если столбец отсутствует.
На самом деле, давайте создадим метод расширения:
public static bool HasColumn(this IDataRecord r, string columnName)
{
try
{
return r.GetOrdinal(columnName) >= 0;
}
catch (IndexOutOfRangeException)
{
return false;
}
}
Редактировать
Хорошо, в последнее время этот пост начинает набирать несколько отрицательных голосов, и я не могу удалить его, потому что это принятый ответ, поэтому я собираюсь обновить его и (надеюсь) попытаться оправдать использование обработка исключений как поток управления.
Другой способ достижения этого, как , опубликованный Чедом Грантом , состоит в том, чтобы циклически проходить через каждое поле в DataReader и выполнять сравнение без учета регистра для имени поля, которое вы ищете. Это будет работать очень хорошо, и, честно говоря, вероятно, будет работать лучше, чем мой метод выше. Конечно, я бы никогда не использовал описанный выше метод внутри цикла, где производительность была проблемой.
Я могу вспомнить одну ситуацию, в которой метод try / GetOrdinal / catch будет работать, когда цикл не работает. Однако сейчас это абсолютно гипотетическая ситуация, поэтому это очень неубедительное оправдание. В любом случае, терпите меня и посмотрите, что вы думаете.
Представьте себе базу данных, которая позволила вам "псевдоним" столбцы в таблице. Представьте себе, что я могу определить таблицу со столбцом с именем «EmployeeName», но также дать ей псевдоним «EmpName», и выполнение выбора для любого имени вернет данные в этом столбце. Со мной так далеко?
Теперь представьте, что для этой базы данных есть провайдер ADO.NET, и они кодировали для него реализацию IDataReader, которая учитывает псевдонимы столбцов.
Теперь dr.GetName(i)
(как в ответе Чада) может возвращать только одну строку, поэтому он должен возвращать только один из "псевдонимов" столбца. Однако GetOrdinal("EmpName")
может использовать внутреннюю реализацию полей этого провайдера, чтобы проверить псевдоним каждого столбца для искомого имени.
В этой гипотетической ситуации с "псевдонимами столбцов" метод try / GetOrdinal / catch будет единственным способом убедиться, что вы проверяете каждую вариацию имени столбца в наборе результатов.
Flimsy? Конечно. Но стоит подумать. Честно говоря, я бы предпочел «официальный» метод HasColumn для IDataRecord.