DbNull.Value и isDBNull для столбца данных

У меня есть DataRow, которые содержат данные из database. Я хочу проверить каждый столбец данных на наличие значения Null в условии IF. Я нашел два способа проверить значение NULL.

 If IsDBNull(drType("ISShort")) Then
    StartDate.Visible = True
 Else
    StartDate.Visible = False
 End If

а также

 If Not drType("ISShort").ToString Is DBNull.Value  Then
   StartDate.Visible = True
 Else
   StartDate.Visible = False
 End If

Оба работают нормально для меня, но я не знаю, какой из них лучше использовать?


person Abdul    schedule 11.07.2016    source источник
comment
drType("ISShort").ToString Is DBNull.Value должно вызвать у вас проблемы, так как вы что-то конвертируете в строку. Это действительно DBNull.Value?   -  person Alex B.    schedule 11.07.2016
comment
Да, это точно такой же код, который я использовал   -  person Abdul    schedule 11.07.2016


Ответы (2)


Я предпочитаю DataRow.IsNull, который возвращает bool, удобочитаем и эффективен:

StartDate.Visible = drType.IsNull("ISShort")

связанные: Какой из IsDBNull и IsNull следует использовать?

Обратите внимание, что ваш второй подход не работает. Если вы преобразуете его в String с помощью ToString, это не может быть DBNull.Value. Это компилируется только с параметром-строгим, установленным на off, что я настоятельно не рекомендую.

person Tim Schmelter    schedule 11.07.2016
comment
Спасибо @Тим. Тогда для чего DBNull.Value. Код был ранее написан с использованием DBNull.Value, и когда я отлаживаю код, он работает нормально. - person Abdul; 11.07.2016
comment
Последний пункт я написал в своем комментарии. Но @Abdul сказал, что он получил правильные результаты с подходом ToString. Как это может быть? - person Alex B.; 11.07.2016
comment
drType("ISShort") содержит значение boolean. Думаю, я предоставил полный раздел кода для тестирования. - person Abdul; 11.07.2016
comment
@Abdul: это срабатывает случайно, потому что VB пытается исправить ваш код. Он волшебным образом преобразует DbNull.Value в строку, вызывая ToString, который возвращает String.Empty. Но не делайте этого, вместо этого напишите безопасный код. Он все равно не скомпилируется, если вы измените его на параметр strict, что вы всегда должны делать для всего проекта. - person Tim Schmelter; 11.07.2016
comment
@AlexB.: посмотрите на мой последний комментарий, это одна из функций VB, позволяющая исправить для вас неработающий код. Я бы не стал использовать функцию IsDbNull потому что это старая глобальная функция VB6, поэтому она не .NET и не будет компилироваться в C#, и она менее эффективна. - person Tim Schmelter; 11.07.2016
comment
Спасибо. Я неправильно истолковал ваш ответ как IsDbNull вместо IsNull. Эти старые функции совместимости VB6 действительно благословение;) - person Alex B.; 11.07.2016

Второй случай не имеет смысла, так как делает ненужным ToString().

Обратите внимание, что есть еще один способ использовать DbNull.

If DbNull.Value.Equals(row.Item(fieldName)) Then
...

вы также можете использовать myDataRow.IsNull(fieldName), который быстрее в соответствии с Which следует использовать IsDBNull и IsNull?

person user2316116    schedule 11.07.2016