Хорошо, это странно.Я столкнулся с этой проблемой сегодня вечером, когда добавлял функцию для нашего корпоративного сайта.
Я создаю пользовательский элемент управления календаря, который запрашивает нашу базу данных для отображения корпоративных событий.Вот ситуация, в которой хранится значение 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
.Поэтому я подумал над этим и придумал этот код, который успешно работает, хотя мне он не нравится, и я думаю, что он ужасен.:
, IIf(dr.IsDBNull(column), Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _
Думая, что он должен работать, потому что он должен оценивать dr()
, только если он не NULL
.Тем не менее, он продолжал выдавать ошибку в конце, потому что значение было на самом деле NULL
.
Итак, чтобы наконец добраться до моего вопроса, извините за длинное объяснение.
Почему, несмотря на то, что я проверяю, является ли оно NULL
перед использованием значения, оно выдает ошибку в той части, которая не вызывается, если это не NULL
?Связано ли это с тем, что я использую IIF()
и он оценивает весь оператор?Или, используя dr()
, он оценивает во время выполнения?
Я просто озадачен и хотел бы знать, что именно происходит, поэтому, если это возможно, придумайте более чистое решение.
Заранее спасибо!