2015-01-04 2 views
2

Я пишу код VB.Net, который читает таблицу Oracle через SQL-запрос.Как проверить, не имеет ли значение DataReader значение null?

SQL-запрос может возвращать несколько нулевых столбцов. Я пытаюсь проверить, являются ли эти столбцы нулевыми или нет, но я получаю ошибку Исключение типа «System.InvalidCastException» произошло в Oracle.DataAccess.dll, но не было обработано в коде пользователя. Колонка содержит некоторые нулевые данные

Вот мой код:

Dim Reader as OracleDataReader 
'Execute the query here... 

Reader.Read() 
If IsNothing(Reader.GetDateTime(0)) Then 'Error here !! 
     'Do some staff 
end if 

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

Спасибо

ответ

3

Nothing означает объект не был инициализирован, DBNull означает, что данные не определен/отсутствуют. Есть несколько способов, чтобы проверить:

' The VB Function 
If IsDBNull(Reader.Item(0)) Then... 

Метод GetDateTime является проблематичным, поскольку вы просите его, чтобы преобразовать нон значение DateTime. Item() возвращает объект, который может быть легко протестирован до конвертация.

' System Type 
If System.DBNull.Value.Equals(...) 

Вы также можете использовать DbReader. Это работает только с порядковым индексом, а не имя столбца:

If myReader.IsDbNull(index) Then 

Исходя из этого, вы можете соединить функции либо как разделяемые члены класса или переработаны в расширения для проверки DBNull и вернуть значение по умолчанию:

Public Class SafeConvert 
    Public Shared Function ToInt32(Value As Object) As Integer 
     If DBNull.Value.Equals(Value) Then 
      Return 0 
     Else 
      Return Convert.ToInt32(Value) 
     End If 
    End Function 

    Public Shared Function ToInt64(Value As Object) As Int64 
     If DBNull.Value.Equals(Value) Then 
      Return 0 
     Else 
      Return Convert.ToInt64(Value) 
     End If 
    End Function 

    ' etc 
End Class 

Использование:

myDate = SafeConvert.ToDateTime(Reader.Item(0)) 

для преобразователя DateTime, вы должны решить, что вернуться. Я предпочитаю делать это индивидуально.

1

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

If (Reader.IsDBNull(0)) Then 
    'Null: Do not call GetDateTime 
End If 

If (Not Reader.IsDBNull(0)) Then 
    'Not null: Retrieve the datetime. 
    Dim dt As DateTime = Reader.GetDateTime(0) 
End If 
Смежные вопросы