Элемент .Net SqlDataReader имеет значение Null [VB] - PullRequest
1 голос
/ 22 июня 2011

Хорошо, это странно.Я столкнулся с этой проблемой сегодня вечером, когда добавлял функцию для нашего корпоративного сайта.

Я создаю пользовательский элемент управления календаря, который запрашивает нашу базу данных для отображения корпоративных событий.Вот ситуация, в которой хранится значение 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(), он оценивает во время выполнения?

Я просто озадачен и хотел бы знать, что именно происходит, поэтому, если это возможно, придумайте более чистое решение.

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

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
0 голосов
/ 22 июня 2011

Функция Iif оценивает каждый оператор, используйте для своей пустой проверки другую конструкцию, например Функция IF

...