Почему я получаю InvalidCastException при чтении значений из OdbcDataReader после проверки на нулевые значения? - PullRequest
2 голосов
/ 03 февраля 2012

Используя OdbcDataReader в C #, у меня есть запрос, который возвращает целочисленный столбец, который может содержать нули.

Для каждой строки я хочу проверить, является ли значение нулевым, и обработать его соответствующим образом. Однако, когда я делаю это с помощью IsDBNull, я получаю InvalidCastException даже для строк, которые не равны NULL. Почему это происходит?

Если я пропускаю проверку IsDBNull, я получаю сообщение об ошибке только для строк, которые содержат нули.

OdbcConnection DbConnection = new OdbcConnection("DSN=...");
DbConnection.Open();
OdbcCommand DbCommand = DbConnection.CreateCommand();
DbCommand.CommandText = @"
                        select 1 as result from dual
                        union
                        select null as result from dual";
OdbcDataReader DbReader = DbCommand.ExecuteReader();
Int32 result;
while (DbReader.Read())
{
    if (!DbReader.IsDBNull(0))
    {
        result = DbReader.GetInt32(0);  // Results in InvalidCastException
    }
    else
    {
        result = 0;
    }
    Console.WriteLine(Convert.ToString(result));
}

Console.ReadLine();

Edit:

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

object resultObject = DbReader.GetValue(0);
if (resultObject != DBNull.Value)
{
    result = Convert.ToInt32(resultObject);
}
else
{
    result = 0;
}

1 Ответ

5 голосов
/ 03 февраля 2012

Скорее всего, это происходит потому, что значение не относится к типу Int32.

Вы можете определить тип поля с помощью DbReader.GetFieldType(0);

. Или вы можете обработать его, преобразовав его в Int32 с Convert.ToInt32(DbReader.GetValue(0));

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...