2016-04-07 4 views
0

Я пытаюсь считывать значения из System.Data.Odbc.OdbcDataReader. Проблема заключается в том, что он просто не работает. Когда я пытаюсь получить значение из существующего столбца (поле), он выдает исключение. В моем cae, FieldCount - это 8, но, например, если я вызываю reader.IsDBNull (4), он бросает.IDbReader исключает исключения для существующих столбцов

Для значений столбцов значений от 0 до 2 оно возвращает правильное значение. Но читатель [3] читателю [7], исключение бросается без информации о том, что произошло.

Хуже того, этот код (GetName) также вызывает одно и то же исключение!

for (int ordinal = 0; ordinal < reader.FieldCount; ordinal++) 
{ 
    Console.WriteLine("Field {0}: {1}", ordinal, reader.GetName(ordinal)); 
} 

Это исключение, которое вызывается, когда я получаю значение для существующего столбца:

в System.Data.Odbc.OdbcConnection.HandleError (OdbcHandle hrHandle, RETCODE RETCODE) в System.Data.Odbc.OdbcDataReader.GetColAttribute (Int32 iColumn, SQL_DESC v3FieldId, SQL_COLUMN v2FieldId, обработчик HANDLER) в System.Data.Odbc.OdbcDataReader.GetSqlType (Int32 я) в System.Data.Odbc.OdbcDataReader.GetValue (Int32 i) в System.Dat a.Odbc.OdbcDataReader.IsDBNull (Int32 я) в AisgeXmlVrdb.LogicaNegocio.MappingExtensions.SafeGetString (IDataRecord читатель, Int32 colIndex) в AisgeXmlVrdb.LogicaNegocio.MetodosComunes.ObtenerSolicitudesExportacionTodas()

Я не понимаю что происходит под капотом.

Чтобы добавить немного больше информации, драйвер ODBC, который я использую, - это File Maker от Apple.

Что еще более странно, так это проверка reader[4], reader[5], reader[6] ... также бросает.

Возможно, драйвер ODBC не поддерживает что-то?

ответ

0

Если на «не существует» вы имеете в виду превышает FieldCount то это ожидаемое поведение для всех implementions IDataRecord, как билд в MSDN

Если вы хотите по умолчанию неверного индекса дела String.Empty:

public static string SafeGetString(this IDataRecord reader, int colIndex) 
{ 
    if (((colIndex >= 0) && (colIndex < reader.FieldCount)) && 
     !reader.IsDBNull(colIndex)) 
    { 
     return reader.GetString(colIndex); 
    } 

    return string.Empty; 
} 
+0

Пожалуйста, проверьте исправление. Я допустил ошибку. FieldCount равен 8, и запрос включает ровно 8 полей, но, например, читатель [4] выдает исключение. – SuperJMN

0

Я не знаю, что вы ожидаете, если индекс столбца больше, чем общее количество столбцов в данных. Должно быть исключение.

Кроме этого, вы можете сократить код, чтобы использовать Convert.ToString вместо явной проверки на DBNull.Value. Convert.ToString вернет пустую строку в случае DBNull.Value, это то, что вы делаете в своем методе. Так что ваш метод может быть:

public static string SafeGetString(this IDataRecord reader, int colIndex) 
{ 
    return Convert.ToString(reader[colIndex]); 
} 

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

public static string SafeGetString(this IDataRecord reader, int colIndex) 
{ 
    if (colIndex >= 0 && colIndex < reader.FieldCount) 
    { 
     return Convert.ToString(reader[colIndex]); 
    } 
    else 
    { 
     return ""; 

    } 
} 

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

+0

Пожалуйста, проверьте исправление. Я допустил ошибку. FieldCount равен 8, и запрос включает ровно 8 полей, но, например, читатель [4] выдает исключение. – SuperJMN

Смежные вопросы