Вопрос

Я использую набор данных для извлечения данных из БД. Одно из полей подряд 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top