Проверка DBNull создает исключение StrongTypingException - PullRequest
9 голосов
/ 14 января 2011

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

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

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

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

Ответы [ 6 ]

17 голосов
/ 14 января 2011

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

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

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

If Not aRow.IsSomeFieldNull Then
   'do something
End If
5 голосов
/ 14 января 2011

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

4 голосов
/ 14 января 2011

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

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

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

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

3 голосов
/ 20 июня 2011

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

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

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

Удачи.

1 голос
/ 10 июля 2013

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

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

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

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

1 голос
/ 23 февраля 2012
**DateTime? ToDate = (row.IsToDateNull()) ? null : row.IsToDate;**
...