簡體   English   中英

.Net SqlDataReader項為空[VB]

[英].Net SqlDataReader Item is Null [VB]

好吧,這很奇怪。 今晚在為公司網站添加功能時遇到了這個問題。

我正在構建一個自定義日歷控件,該控件查詢我們的數據庫以顯示公司事件。 在這種情況下,存儲了一個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錯誤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"))) _

認為它應該起作用是因為它僅應在不為NULL情況下評估dr() 但是,由於該值實際上為NULL ,因此它始終在最后出錯。

因此,終於解決了我的問題,對不起您的冗長解釋。

為什么即使我在使用該值之前先檢查它是否為NULL ,但除非它不是NULL否則它在不會被調用的部分會出錯? 它是否與我使用IIF()並評估整個語句有關? 還是使用dr()在運行時求值?

我只是很困惑,想知道到底發生了什么,因此,如果可能的話,提出一個更清潔的解決方案。

提前致謝!

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

Iif函數正在評估每個語句,對您的空檢查使用不同的構造,例如IF函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM