.Net SqlDataReader Item是Null [VB]

时间:2011-06-21 22:18:56

标签: .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

但事实并非如此,我仍然遇到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

真正让我感动的是,有一次我有这个:

, IIf(dr.IsDBNull(column), Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _

认为它应该有效,因为它只应评估dr(),如果它不是NULL。但是,它最终会出错,因为该值实际上是NULL

所以最后得到我的问题,抱歉这个漫长的解释。

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

我很难过,想知道究竟发生了什么,所以如果可能,请提出一个更清洁的解决方案。

提前致谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

Iif函数正在评估每个语句,使用不同的构造进行空检查,例如The IF function