.Net SqlDataReader Item是Null [VB]

Kyl*_*ned 1 .net vb.net null sqldatareader

好的,这很奇怪.今晚我在为公司网站添加功能时遇到了这个问题.

我正在构建一个自定义日历控件,用于查询我们的数据库以显示公司事件.这是情况,EndDate存储了一个值,并且在开发系统上,其中一个事件具有NULL值.没什么大不了的,因为它只是一个测试系统,但在尝试使用它之前还要检查安全方面.我认为以下代码可行:

While dr.Read()
  corporateTable.Rows.Add(New Object() { _
    Convert.ToDateTime(dr("EventBeginDate")) _
    , IIf(dr("EventEndDate") Is DBNull.Value, Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _
    , Convert.ToString(dr("EventType")) _
    , Convert.ToString(dr("EventDescription")) _
    , Convert.ToString(dr("EventMessage")) _
  })
End While
Run Code Online (Sandbox Code Playgroud)

但它没有,我仍然得到Object cannot be cast from DBNULL错误.所以我考虑过它并提出了这个成功运行的代码,虽然我不喜欢它并认为它很难看.

While dr.Read()
  Dim column As Integer = 0
  While column < dr.FieldCount - 1
    If dr.GetName(column) = "EventEndDate" Then
      Exit While
    End If

    column += 1
  End While
  corporateTable.Rows.Add(New Object() { _
    Convert.ToDateTime(dr("EventBeginDate")) _
    , IIf(dr.IsDBNull(column), Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), dr.Item(column)) _
    , Convert.ToString(dr("EventType")) _
    , Convert.ToString(dr("EventDescription")) _
    , Convert.ToString(dr("EventMessage")) _
  })
End While
Run Code Online (Sandbox Code Playgroud)

真正让我感觉到的是,有一点我有这个:

, IIf(dr.IsDBNull(column), Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _
Run Code Online (Sandbox Code Playgroud)

认为它应该工作,因为它应该只评估dr()它是否不是NULL.但是,它最终仍然出错,因为这个价值实际上已经存在NULL.

所以最后得到我的问题,对不起,长期解释.

为什么即使我NULL在使用该值之前检查它是否存在,它会在未被调用的部分出错,除非它不是NULL?这是否与我正在使用它IIF()并且它正在评估整个声明的事实有关?或者,使用它dr(),它在运行时评估?

我只是难过,想知道到底发生了什么,所以如果可能的话,想出一个更清洁的解决方案.

提前致谢!

Wil*_*l A 5

IIf总是评估真假部分 - If如果你想避免这种情况,请使用内联:

While dr.Read()
  corporateTable.Rows.Add(New Object() { _
    Convert.ToDateTime(dr("EventBeginDate")) _
    , If(dr("EventEndDate") Is DBNull.Value, Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _
    , Convert.ToString(dr("EventType")) _
    , Convert.ToString(dr("EventDescription")) _
    , Convert.ToString(dr("EventMessage")) _
  })
End While
Run Code Online (Sandbox Code Playgroud)