2014-12-02 1 views
0

Это может быть какой-то тривиальный вопрос, но до сих пор я не мог его получить (поскольку я сказал, что уверен, что это довольно просто, но я не вижу его).ADO.NET проверяет, если имя столбца в выбранных столбцах

Я делаю отборное с ADO.NET, что-то вроде этого

SELECT col1,col2 from table1 

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

Например, я попытался это, но он не работает (она всегда возвращает ложь)

private bool SpalteExistiert(FbDataReader Reader, string MyColumnName) 
{ 
    return Reader.GetSchemaTable() 
     .Rows 
     .OfType<DataRow>() 
     .Any(row => row["ColumnName"] == MyColumnName); 
} 

Когда я пытаюсь его обычным способом, как getOrdinal или просто Reader["MyCustomColum"] и попытаться проверить, если она равна нулю, я получить исключение IndexOutOfBounds, когда столбец не был в исключении. Я знаю, что один из способов будет поймать исключение, но это не так, как я хочу, и все-таки я не могу поверить, что нет другого пути, чтобы проверить, если Колум доступен

Спасибо

+0

Почему бы не обрабатывать исключения ? –

+0

Как я уже сказал, я не могу поверить, что язык не предлагает другого способа сделать это. И другая причина в том, что программирование, в котором я полагаюсь на исключения, - это не тот стиль, который я предпочитаю :) – user3466562

+2

Пробовал ли вы использовать коллекцию Columns, а не 'Rows'? Что-то вроде 'Reader.GetSchemaTable() .Columns .OfType () .Any (столбец => column.ColumnName == MyColumnName);' – Michael

ответ

0
private bool SpalteExistiert(FbDataReader Reader, string MyColumnName) 
{ 
    return Reader.GetSchemaTable() 
     .Rows 
     .OfType<DataRow>() 
     .Any(row => string.Equals(row.Field<string>("ColumnName"), MyColumnName, StringComparison.InvariantCultureIgnoreCase)); 
} 
+0

Это все равно вызовет исключение IndexOutOfBounds. – Michael

+0

@Michael I попробовал его на SqlDataReader, и он отлично работал. Где именно генерируется исключение «IndexOutOfBounds»? – mainvoid

+0

Ну проигнорируйте мой комментарий, неважно. – Michael

0

вы можете попробовать следующее

private bool SpalteExistiert(FbDataReader Reader, string MyColumnName) 
{ 
    return Reader.GetSchemaTable() 
     .Rows 
     .OfType<DataRow>() 
     .Any(row => row.Table.Columns.Contains(MyColumnName)); 
} 
0

Попробуйте этот метод расширения

public static bool HasColumn(this IDataRecord dr, string columnName) 
    { 
     for (int i = 0; i < dr.FieldCount; i++) 
     { 
      if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase)) 
       return true; 
     } 
     return false; 
    }