2011-11-22 2 views
3

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

я попробовать:

int columnOrdinal = reader.GetOrdinal("LastName"); 
columnExists = (columnOrdinal < 0); 

но GetOrdinal бросает исключение, если столбец не существует. Мой случай не является исключительным. Все наоборот. Это ... ceptional.


Примечание: не связанно с моим вопросом, но, то реальной причины я хочу знать, если столбец существует, потому что я хочу, чтобы получить порядковое положение колонны, без выбрасывания исключения если столбец не существует:

int columnOrdinal = reader.GetOrdinal("Lastname"); 

Примечание: не связано с моим вопросом, но, то реального причины я хочу знать, если столбец существует, потому что я хочу знать, если столбец содержит нуль:

itIsNull = reader.IsDBNull(reader.GetOrdinal("Lastname")); 

К сожалению IsDBNull занимает порядковый, и GetOrdinal бросает исключение. Так что я оставил с:

if (ColumnExists(reader, "Lastname")) 
{ 
    itIsNull = reader.IsDBNull(reader.GetOrdinal("Lastname")); 
} 
else 
    itIsNull = false; 

Примечание: не связано с моим вопросом, но реальная причина, я хочу знать, если столбец существует, потому что там будет раз, когда колонка не будет присутствовать в набор результатов, и я не хочу бросать результаты обработки обработки исключений, поскольку это не является исключительным.

+1

NotRelatedToMyQuestionException –

+0

возможно дубликат http://stackoverflow.com/questions/373230/check-for-column-name-in-a-sqldatareader-object – hatchet

+0

@hatchet Это конечно, не метод, который я собираюсь вызывать в каждой строке набора данных –

ответ

3

Существует ограничение на то, что вы можете делать, поскольку IDataReader не предоставляет много полезного. Используя петлю, как показано в ответе на аналогичный вопрос

Check for column name in a SqlDataReader object

Вы могли бы, с первой строкой вы обрабатываете, построить простой словарь, который заклиненный по имени столбца с порядковыми в качестве значений (или HashSet если вам не нужны порядковые значения). Тогда вы можете просто использовать columnDictionary.ContainsKey («LastName») в качестве теста. Вы только построили словарь один раз, для первой встреченной строки, тогда все последующие строки будут быстрыми.

Но, честно говоря, по сравнению с временем базы данных, время, затрачиваемое на использование as-is решения в этом другом потоке qsustion stackoverflow, вероятно, будет незначительным.

Edit: дополнительные возможности здесь: Checking to see if a column exists in a data reader

+0

Проблема в том, что код выполняется один раз для каждой строки в 'IDataReader'. С возможностью четырех отсутствующих столбцов каждая итерация и 40 000 итераций составляет 80 000 исключений (вместо нуля). Ответ кажется «Вы не можете этого сделать». я закручу * «Существует предел ...» * в * «Невозможно сделать» *, и назовите его принятым. +1 для некоторых обходных решений, которые могут помочь другим людям в других ситуациях, но на мой вопрос был дан ответ. –

+0

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