Обрабатывать таблицу базы данных с нулевыми датами, используя Nullable(Of Date)

У меня есть таблица SQL Server с несколькими столбцами даты, которые могут быть NULL и на самом деле NULL,

Я думал, что справляюсь с этим правильно, используя тест .HasValue, прежде чем пытаться получить значение обнуляемого типа. Но, очевидно, не потому, что я получаю InvalidOperationException - у объекта Nullable должно быть значение - когда получатель в моем объекте класса пытается заполнить текстовое поле:

Public Class EventItem
    Private _AcknowledgeDate As Nullable(Of Date)
    Public Property AcknowledgeDate() As Date?
        Get
            Return _AcknowledgeDate
        End Get
        Set(ByVal value As Date?)
            If value.HasValue Then
                _AcknowledgeDate = value
            Else
                _AcknowledgeDate = Nothing
            End If
        End Set
    End Property

мой конструктор получает данные с сервера SQL; вот фрагмент из конструктора:

Me.AcknowledgeDate = If(IsDBNull(theRdr("AcknowledgeDate")), Nothing, theRdr("AcknowledgeDate"))

Когда вышеприведенный установщик запускается, дата имеет значение Null, а закрытой переменной _AcknowledgeDate установлено значение Nothing.

Когда код пытается присвоить что-то текстовому полю, код получателя получает здесь исключение:

txtAcknowledgeDate.Text = thisEvent.AcknowledgeDate

Я могу сделать назначение текстового поля следующим образом: txtAcknowledgeDate.Text = Nothing

Несмотря на то, что я довольно много читал об этой функции типа Nullable, я думаю, что я совершенно не понимаю, как реализовать даты с Nullable в VB.Net.

1 ответ

Решение

Ваш AcknowledgeDate уже NothingВы устанавливаете это сами в конструкторе. Вам не нужно указывать это снова в Set функция, на самом деле вы просто говорите "если значение равно Nothing, тогда установите его как Nothing", что является избыточным.

Я считаю, что проблема в том, что вы пытаетесь присвоить этому объекту ссылку Nothing на текстовое поле. .Text свойство, и это приводит к исключению.

TextBox.Text ожидает String Я не вижу причины использования Nothing, Создать Function обращаться с Nothing значения и показать пустую строку вместо. Кроме того, это дает вам свободу форматировать вашу дату, как вам нравится.

что-то вроде

Function getDateText(ByVal d As Date?) As String
  If d.HasValue = False Then
     Return ""
  End If

  Return d.Value.ToString("D")
End Function

а затем позвоните, когда вы хотите установить txtAcknowledgeDate.Text

txtAcknowledgeDate.Text = getDateText(thisEvent.AcknowledgeDate)
Другие вопросы по тегам