Как DBNull может не равняться DBNull

У меня есть следующая строка кода

if (DBNull.Value.Equals(o) || o != null)

где o равно object o in row.ItemArray Я продолжаю получать сообщение об ошибке -->

Xml type "List of xdt:untypedAtomic" does not support a conversion from Clr type "DBNull" to Clr type "String".

Чего я не понимаю, так это того, что когда я выполняю свой код, этот if должен поймать это и выполнить мое альтернативное действие, но это не так?

Может кто-нибудь, пожалуйста, пролить свет для меня.

Благодарю вас!


person Refracted Paladin    schedule 13.01.2010    source источник
comment
Можете ли вы опубликовать еще немного кода? куда тебя назначают?   -  person hackerhasid    schedule 14.01.2010
comment
Каков результат Console.WriteLine(o.GetType().Name);?   -  person jason    schedule 14.01.2010
comment
я думаю, что это немного странно, сначала вы сравниваете с DBNull, а затем с not null   -  person Yevhen    schedule 14.01.2010
comment
Вероятно, у вас где-то еще ошибка.   -  person SLaks    schedule 14.01.2010
comment
Обратите внимание, что во многих ситуациях пустые значения базы данных ведут себя не так, как другие объекты. Пустая база данных представляет концепцию, которую я не знаю. Когда вы говорите, что х, которого я не знаю, равен у, которого я тоже не знаю, то разумный ответ — не да. Разумный ответ - не знаю. Вот почему в VB сравнение нулевого значения с нулевым приводит к нулевому значению, а не к истинному или ложному. Здесь вы можете столкнуться с похожей ситуацией.   -  person Eric Lippert    schedule 14.01.2010


Ответы (3)


Попробуйте использовать

Convert.IsDBNull.

person SolutionYogi    schedule 14.01.2010

Я думаю, твоя проблема в том, что на самом деле

DBNull.Value == null 
//is always false

DBNull — это специальный класс для сравнения значений, возвращаемых из дБ, поэтому вам действительно нужно проверить нулевое условие И DBNull.value, если ваш массив содержит оба.

EDIT: Извините, если внимательно посмотреть на ваш код, возможно, вам просто нужно отменить операцию ИЛИ. Если o == null, ваш первый оператор взорвется с вашим исключением. Пытаться:

if (o != null || o == DBNull.Value) 
person Tj Kellie    schedule 13.01.2010
comment
это редактирование неверно, поскольку оно выполняет прямо противоположную проверку того, что имеется в виду. Как правильно говорит @ThomasLevesque, вместо этого должно быть if (o == null || o == DBNull.Value). Но первое утверждение также не должно быть проблемой, но этот стиль действительно приводит к проблеме многих ошибок кодирования, когда он будет генерировать исключения, когда объект имеет значение null. поэтому очень полезно всегда проверять значение null или не null сначала, прежде чем делать что-либо еще со значением. - person Shawn Kovac; 08.02.2016
comment
ошибки, которые «взрывают код», возникают, когда вы пытаетесь что-то вроде if (o.ToString()) { ... }, потому что тогда, когда o равно null, любые свойства или функции метода, такие как «.ToString()», вызовут ошибку. поэтому всегда рекомендуется сначала проверять значение null или не null. Однако if (DBNull.Value.Equals(o) || o != null) не обращается ни к какому свойству o. И если метод правильно обрабатывает нулевое значение, то нет ошибки, когда o равно null. Но МНОГИЕ программисты забывают проверять на null, поэтому передача null во МНОГИЕ методы часто вызывает много проблем, потому что, честно говоря, большая часть кода неряшлива. - person Shawn Kovac; 08.02.2016

может такое сравнение поможет

if ( !o.GetType().Equals( DBNull.Value ) )

or

if (o is DBNull)

person Yevhen    schedule 13.01.2010