#.net #vb.net #ado.net #dataset #datarow
Вопрос:
Я читаю XML-файл в набор данных, и мне нужно извлечь данные из набора данных. Поскольку это редактируемый пользователем конфигурационный файл, поля могут быть там, а могут и не быть. Чтобы хорошо обрабатывать недостающие поля, я хотел бы убедиться, что каждый столбец в потоке данных существует и не является DBNull.
Я уже проверяю наличие DBNull, но я не знаю, как убедиться, что столбец существует, не вызывая исключения или не используя функцию, которая перебирает все имена столбцов. Каков наилучший способ сделать это?
Ответ №1:
DataRow хороши тем, что с ними связана их базовая таблица. С помощью базовой таблицы вы можете проверить, что в определенной строке есть определенный столбец.
If DataRow.Table.Columns.Contains("column") Then
MsgBox("YAY")
End If
Ответ №2:
Вы можете использовать DataSet.Tables(0).Columns.Contains(name)
его, чтобы проверить DataTable
, содержит ли он столбец с определенным именем.
Ответ №3:
Другой способ узнать, существует ли столбец, — проверить 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")
, в то же время делая ваш код немного чище.
Ответ №4:
Вы можете инкапсулировать свой блок кода с помощью оператора try … catch, и при запуске кода, если столбец не существует, он вызовет исключение. Затем вы можете выяснить, какое конкретное исключение он создает, и, если вы этого хотите, он обработает это конкретное исключение другим способом, например, вернет «Столбец не найден».
Комментарии:
1. Всегда лучше проверять наличие ошибок, не прибегая к блокировке try…catch; ее следует использовать только в крайнем случае.
2. Хотя это плохой дизайн, Андерс прав, что это сработает. Возможно, это и не заслуживает «за», но, безусловно, не заслуживает «против».