Хранимая процедура возвращает данные о записи пользователя, включая столбец даты и времени, допускающий значение NULL, для даты последнего входа в систему. Какой из них является лучшим выбором при работе с возможностью значений NULL при попытке назначить переменную даты .Net?
Try
_LastLogin = CDate(DT.Rows(0)("LastLogin"))
Catch ex As InvalidCastException
_LastLogin = Nothing
End Try
or
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.
Ответ 1 · рейтинг 6 · Matthew Bonig
Второй фрагмент кода лучше. Исключения предназначены для исключительных случаев, а не для случаев, которые вы ожидаете. Кроме того, намерение намного лучше. Понятно, что вы ожидаете, что DBNull будет возможным значением, и вы хотите обработать его соответствующим образом.
Кроме того, у вас могут быть непредвиденные последствия, если значение не равно null, но не анализируется (хотя, скорее всего, этого никогда не произойдет).
Ответ 2 · рейтинг 2 · Ben Hoffstein
Второй метод предпочтительнее из-за затрат, связанных с созданием исключений (особенно если вы ожидаете, что поле LastLogin будет NULL на регулярной основе).
Вот хорошая запись в блоге с более подробной информацией о исключения (см. часть об исключениях и производительности).
Ответ 3 · рейтинг 2 · user33209
Я использую класс 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"))
который вернет либо ничего, либо дату.
Ответ 4 · рейтинг 1 · m42
в 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. Просто меньше хлопот в дороге.