【发布时间】:2011-06-21 22:18:56
【问题描述】:
好吧,这很奇怪。我今晚在为我们的公司网站添加功能时遇到了这个问题。
我正在构建一个自定义日历控件,用于查询我们的数据库以显示公司活动。情况就是这样,存储了一个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(),它在运行时进行评估?
我很困惑,想知道到底发生了什么,所以如果可能的话,想出一个更清洁的解决方案。
提前致谢!
【问题讨论】:
标签: .net vb.net null sqldatareader