Проверка на DBNull вызывает исключение StrongTypingException.

Я использую набор данных для извлечения данных из БД. Одно из полей в строке — NULL. Я знаю это. Однако следующий код vb.net выдает StrongTypingException (в автоматически сгенерированном методе get_SomeField() в конструкторе наборов данных):

If Not IsDBNull(aRow.SomeField) Then
'do something
End If

Согласно документации и этому вопросу все должно быть в порядке.

edit: If aRow.SomeField is DBNull.Value Then также возвращает ту же ошибку. Арх.


person calico-cat    schedule 14.01.2011    source источник


Ответы (5)


Разница в том, что в соответствующем вопросе речь идет о нетипизированном значении (т.е. object) через индексатор. Когда вы переходите через .SomeField, тип уже включен, так что это может быть int и т. д. И нет смысла пробовать IsDBNull на int, так как int никогда не может быть DBNull.

По сути, SomeField является оболочкой для (извините за акцент С#...)

public int SomeField {
    get { return (int) this["someFieldName"]; }
    set { this["someFieldName"] = value; }
}

Я не большой DataTable человек, но вы можете попробовать проверить это по имени/индексу/столбцу; или пометить столбец как обнуляемый, чтобы он был Nullable<int> (в приведенном выше примере).

person Marc Gravell    schedule 14.01.2011
comment
Спасибо друг. Строка пыталась привести нулевое значение к столбцу, который имел нулевое поведение по умолчанию в качестве исключения. Наборы данных причиняют мне боль. - person calico-cat; 14.01.2011

Некоторая дополнительная информация: исключение возникает из-за того, что вы используете строго типизированный набор данных. В документации StrongTypingException говорится:

Исключение, создаваемое строго типизированным набором данных, когда пользователь обращается к значению DBNull.

Использование строго типизированных наборов данных немного отличается от использования нетипизированных. Со строго типизированными наборами данных вы автоматически получаете некоторые расширенные/дополнительные методы для ваших полей, которые вы можете вызывать. В вашем случае вам, скорее всего, придется позвонить:

If Not aRow.IsSomeFieldNull Then
   'do something
End If
person MicSim    schedule 14.01.2011

Попробуйте это: aRow.IsSomeFieldNull

person royas    schedule 14.01.2011

Есть аккуратный способ обойти это. Но нужно знать о последствиях.

Чтобы предотвратить возникновение исключения, вы можете изменить свойство NullValue поля DataSet на «Null» или «Empty» (в зависимости от ваших потребностей). По умолчанию установлено значение «Выдать исключение».

Для справки см. здесь: документация msdn

Удачи.

person Falcon    schedule 20.06.2011

Этот вопрос старый, но то, что я добавляю, похоже, не входит ни в один из других ответов.

Если вы используете

If Not IsDBNull(aRow.item("SomeField")) Then
    'do something
End If

Это не вызовет исключения, даже если вы используете строго типизированный набор данных.

person 5uperdan    schedule 10.07.2013
comment
Это - простейшее. - person stigzler; 08.07.2019