Проверка на dbnull бросает сильное
Вопрос
Я использую набор данных для извлечения данных из БД. Одно из полей подряд NULL
. Анкет Я знаю это. Однако следующий код VB.NET выбрасывает StrongTypingException
(В методе автогенерированного get_somefield () в дизайнере набора данных):
If Not IsDBNull(aRow.SomeField) Then
'do something
End If
Согласно документации и этот вопрос Это должно быть хорошо.
редактировать: If aRow.SomeField is DBNull.Value Then
Также возвращает ту же ошибку. Арг.
Решение
Разница в том, что в связанном вопросе это говорит о нетипированной ценности (т.е. object
) через индексатор. Когда вы идете через .SomeField
, тип уже включен - так что это может быть int
и т.д. и не имело бы смысла попробовать IsDBNull
на int
, как int
Можно никогда быть DBNull
.
По сути SomeField
это обертка (извините за акцент C# ...)
public int SomeField {
get { return (int) this["someFieldName"]; }
set { this["someFieldName"] = value; }
}
Я не огромный DataTable
человек, но вы можете попробовать проверить его по имени/index/column; или отмечать колонку как нулевую, так что он Nullable<int>
(в примере выше).
Другие советы
Просто некоторая дополнительная информация: исключение происходит потому, что вы используете сильно напечатал набор данных. StrongtypingException В документации это говорит:
Исключение, которое бросается сильно набранным набором данных, когда пользователь обращается к значению dbnull.
Использование сильно напечатанных наборов данных немного отличается от использования нетипированных. Благодаря сильно напечатанным наборам данных вы получаете автоматически некоторые расширенные/дополнительные методы для ваших полей, которые вы можете позвонить. В вашем случае вам, скорее всего, придется позвонить:
If Not aRow.IsSomeFieldNull Then
'do something
End If
Попробуйте это: arow.issomefieldnull
Есть аккуратный способ обойти это. Но вы должны знать о последствиях.
Чтобы предотвратить исключение, вы можете изменить свойство набора данных на наборе данных Nullvalue на «нулевой» или «пустой» (что бы соответствовало вашим потребностям). По умолчанию установлено «бросить исключение».
Для обращения здесь справочник: Документация MSDN
Удачи.
**DateTime? ToDate = (row.IsToDateNull()) ? null : row.IsToDate;**
Этот вопрос старый, но то, что я добавляю, не кажется ни в одном из других ответов.
Если вы используете
If Not IsDBNull(aRow.item("SomeField")) Then
'do something
End If
Это не вызовет исключение, даже если вы используете сильно напечатанный набор данных