Я читаю XML-файл в DataSet, и мне нужно получить данные из DataSet. Поскольку это файл конфигурации, доступный для редактирования пользователем, поля могут быть там, а могут и не быть. Чтобы правильно обрабатывать отсутствующие поля, я хотел бы убедиться, что каждый столбец в DataRow существует, а не DBNull.
Я уже проверяю DBNull, но я не знаю, как убедиться, что столбец существует, не создавая исключения или не используя функцию, которая перебирает все имена столбцов. Как лучше всего это сделать?





Вы можете инкапсулировать свой блок кода с помощью оператора try ... catch, и когда вы запустите свой код, если столбец не существует, он выдаст исключение. Затем вы можете выяснить, какое именно исключение он выбрасывает, и при желании обработать это конкретное исключение другим способом, например, вернуть «Столбец не найден».
Хотя это плохой дизайн, Андерс прав, он сработает. Возможно, он не заслуживает голосования "за", но определенно не заслуживает "против".
Вы можете использовать DataSet.Tables(0).Columns.Contains(name), чтобы проверить, содержит ли DataTable столбец с определенным именем.
DataRow хороши тем, что с ними связана их базовая таблица. С помощью базовой таблицы вы можете убедиться, что в конкретной строке есть определенный столбец.
If DataRow.Table.Columns.Contains("column") Then
MsgBox("YAY")
End If
Другой способ узнать, существует ли столбец, - это проверить для Nothing значение, возвращаемое индексатором коллекции Columns при передаче ему имени столбца:
If dataRow.Table.Columns("ColumnName") IsNot Nothing Then
MsgBox("YAY")
End If
Этот подход может быть предпочтительнее того, который использует метод Contains("ColumnName"), когда следующий код впоследствии должен будет получить этот DataColumn для дальнейшего использования. Например, вы можете узнать, какой тип имеет значение, хранящееся в столбце:
Dim column = DataRow.Table.Columns("ColumnName")
If column IsNot Nothing Then
Dim type = column.DataType
End If
В этом случае такой подход избавляет вас от вызова Contains("ColumnName") и в то же время делает ваш код немного чище.
Всегда лучше проверять наличие ошибок, не прибегая к блоку try ... catch; его следует использовать только в крайнем случае.