Обрабатывать таблицу базы данных с нулевыми датами, используя 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)