好的,这很奇怪。今晚我在为公司网站添加功能时遇到了这个问题。
我正在构建一个自定义日历控件,用于查询我们的数据库以显示公司事件。在这种情况下,存储了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()
,它会在运行时进行评估吗?
我很难过,想知道究竟发生了什么,所以如果可能,请提出一个更清洁的解决方案。
提前致谢!
答案 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