Получение значения NULL из базы данных и присвоение переменной Date - PullRequest
3 голосов
/ 11 марта 2009

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

    Try
        _LastLogin = CDate(DT.Rows(0)("LastLogin"))
    Catch ex As InvalidCastException
        _LastLogin = Nothing
    End Try

или

    If DT.Rows(0)("LastLogin") Is DBNull.Value Then
        _LastLogin = Nothing
    Else
        _LastLogin = CDate(DT.Rows(0)("LastLogin"))
    End If

Редактировать : Я также забыл о возможности использования TryParse

    If Not Date.TryParse(DT.Rows(0)("LastLogin").ToString, _LastLogin) Then
        _LastLogin = Nothing
    End If

Какой предпочтительный метод обработки возможных NULL значений из базы данных? Есть ли лучший способ, чем три из перечисленных?

Редактировать # 2 : Я заметил, что метод TryParse не очень хорош при попытке присвоить типу Nullable.

Ответы [ 5 ]

6 голосов
/ 11 марта 2009

Второй фрагмент кода лучше. Исключения для исключительных случаев, а не случаев, которые вы ожидаете. Плюс, намерение намного лучше. Понятно, что вы ожидаете, что DBNull будет возможным значением, и вы хотите обработать его соответствующим образом.

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

2 голосов
/ 11 марта 2009

Я использую класс FixDBNull:

Public Class FixDBNull(Of ItemType)    
    Public Shared Function Convert(ByVal data As Object) As ItemType
        If data IsNot System.DBNull.Value Then
            Dim obj As ItemType = Nothing

            Try
               obj = CType(data, ItemType)    
            Catch ex As Exception
                'do something with the conversion error
            End Try

            Return obj
        Else
            Return Nothing
        End If

End Function
End Class

тогда я могу назвать это так:

_LastLogin = FixDBNull(Of date).Convert( DT.Rows(0)("LastLogin"))

, который вернет либо ничего, либо дату.

2 голосов
/ 11 марта 2009

Второй метод предпочтительнее из-за затрат на создание исключений (особенно если вы ожидаете, что поле LastLogin будет иметь значение NULL на регулярной основе).

Вот хорошее сообщение в блоге с более подробной информацией об исключениях (см. Раздел об исключениях и производительности).

1 голос
/ 11 марта 2009

в VB.net, должно быть Nullable (от даты)

вот один из способов:

dim theDate as nullable(of Date)

    If theDate.HasValue Then
      'you can proceed
    Else
      'you must assign with DBNull.value
    End If

База данных также может повлиять на то, что вы можете сделать. MS Access будет шутить о датах, несмотря ни на что. В конце концов я получил вышеупомянутое, чтобы работать, но я обычно предпочитаю сохранять даты в виде строк в Access. Это просто делает меньше хлопот в будущем.

0 голосов
/ 11 марта 2009

Я бы использовал TryCast, что будет выглядеть примерно так:

_LastLogin = TryCast(DT.Rows(0)("LastLogin"), Date?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...