2011-06-21 52 views
1

好吧,這很奇怪。今晚我在爲我們公司網站添加功能時遇到了這個問題。.Net SqlDataReader項目爲空[VB]

我正在構建一個查詢我們的數據庫以顯示公司事件的自定義日曆控件。這裏是情況,存在一個EndDate值,並且在dev系統上,其中一個事件的值爲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(),它在運行時進行評估?

我只是難住,想知道究竟發生了什麼,所以如果可能的話,拿出一個更乾淨的解決方案。

在此先感謝!

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 

回答

5

IIf總是會評估真假零件The IF function

+0

謝謝,我會給它一個鏡頭。如果有效,我會接受。 –

+0

你也可以嘗試使用這種方法制作一個擴展方法:http://bradwilson.typepad.com/blog/2008/01/c-30-extension.html – turtlepick

+0

@Will:我總是笑出聲來這是因爲函數'IIf'是**即時的簡寫,如果**,這不能離真相更遠。除非您將其解釋爲立即評估這兩種情況。 =) – Yuck

0

的IIF函數評估每個語句,使用不同的結構爲你空檢查,例如:如果你想避免這種使用直列If代替 -