Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Получение значения NULL из базы данных и присвоение переменной Date

Автор вопроса: TheTXIОтветов: 5

Хранимая процедура возвращает данные о записи пользователя, включая столбец даты и времени, допускающий значение 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.

  • Проблема с вашим методом TryParse заключается в том, что вы получите исключение, созданное методом ToString, если LastLogin имеет значение null. Kev 11.03.2009
  • Кев: Если я не ошибаюсь, вызов ToString при извлечении NULL приведет к пустой строке (по крайней мере, так это работает для моей другой информации, извлеченной и сохраненной в строках). Однако, возможно, мне придется сделать еще одну проверку. TheTXI 11.03.2009
  • Да, DBNull.Value.ToString() возвращает String.Empty bdukes 11.03.2009
  • Кев: Я только что проверил это, сделав информацию другого столбца (которая вытягивается как строка) NULL, и она прошла через отладчик, используя .ToString, и присвоила значение строковой переменной. TheTXI 11.03.2009
  • Если базовый столбец является строковым типом (например, varchar и т. д.), то вы совершенно правы, но я почти уверен, что нестроковые типы ToString() вызовут исключение, т.е. дату и время SQL. Kev 11.03.2009
  • @TheTXI - да, ты прав, я исправляюсь. :) Kev 11.03.2009

date

Ответы

Ответ 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. Просто меньше хлопот в дороге.

Ответ 5 · bdukes

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

_LastLogin = TryCast(DT.Rows(0)("LastLogin"), Date?)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы