使用Nullable处理具有空日期的数据库表(Of Date)

时间:2014-08-21 21:38:44

标签: vb.net properties nullable dbnull

我有一个SQL Server表,其中包含多个日期列,可以是NULL,实际上是NULL

在尝试使用可空类型的值之前,我认为我正在使用 .HasValue 测试正确处理此问题。但显然不是因为我得到 InvalidOperationException - Nullable对象必须有值 - 当我的类对象中的getter尝试填充文本框时:

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"))

当上述setter运行时,日期为Null,私有变量 _AcknowledgeDate 设置为 Nothing

当代码尝试将某些内容分配给文本框时,getter代码会在此处获得异常:

txtAcknowledgeDate.Text = thisEvent.AcknowledgeDate

我可以按如下方式分配文本框:txtAcknowledgeDate.Text = Nothing

尽管阅读了很多关于这个可空类型工具的内容,但我想我对如何在VB.Net中实现可为空的日期感到很困惑。

1 个答案:

答案 0 :(得分:1)

您的AcknowledgeDate已经Nothing,您是在构造函数中自己设置的。您不需要在Set函数中再次指定,实际上您只是说“如果值为Nothing,则将其设置为Nothing”,这是多余的。

我认为问题在于您尝试将该对象分配给textbox .Text属性没有任何引用,这会导致异常。

TextBox.Text期待String我看不到使用Nothing的原因。创建Function以处理Nothing值并显示空字符串。此外,它可让您随心所欲地formatting约会。{{3}}

类似

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)