Если приложение обнаруживает ошибку ввода данных, то оно создает описание найденной ошибки для записи или отдельного поля. Для обозначения наличия ошибки в отдельной записи используется свойство RowError объекта DataRow, например ему присваивается строка с комментарием "Something wrong here" (Здесь произошла какая-то ошибка).
myDataRow.RowError = "Something wrong here"
А для обозначения наличия ошибки в отдельном поле используется метод SetColumnError объекта DataRow, например с его помощью присваивается строка с комментарием "Bad data in this column" (Неверные данные в этом поле).
myDataRow.SetColumnError (2, "Bad data in this column")
Для извлечения строк с сообщениями о таких ошибках в полях или записях можно использовать свойство RowError или вызвать метод GetColumnError. Для сброса значения свойства RowError нужно присвоить ему пустую строку (" ") или использовать метод ClearErrors объекта RowError, который очищает свойство RowError и удаляет все сообщения об ошибках, заданные методом SetColumnError.
Объект DataRow содержит свойство HasErrors, которое имеет значение True, если в поле или записи обнаружены какие-либо ошибки. Значение этого свойства отображается на свойство HasErrors объекта DataTable, которое при наличии ошибок в поле или записи также равно True. Аналогично, если свойство HasErrors для любой таблицы DataTable объекта DataSet имеет значение True, то значение свойства HasErrors объекта DataSet также равно True. Метод GetErrors объекта DataTable возвращает массив объектов DataRow, которые содержат ошибки. В целом этот простой механизм позволяет быстро определить любые ошибки ввода данных, как показано в листинге 5.3.
Листинг 5.3. Пример обнаружения ошибок во всех таблицах объекта DataSetPrivate Sub ResolveErrors(myDataSet as DataSet)
Dim rowsWithErrors() As DataRow
Dim myTable As DataTable
Dim myCol As DataColumn
Dim currRow As Integer
For Each myTable In myDataSet.Tables
If myTable.HasErrors Then
' Извлечение всех записей с ошибками.
RowsWithErrors = myTable.GetErrors()
For currRow = 0 To rowsWithErrors.GetUpper
For Each myCol In myTable.Columns
' Найти поля с ошибками и выбрать
' способ их обработки.
' Ошибка в поле извлекается с помощью метода
' rowsWithErrors(currRow).GetColumnError(myCol)
Next
' очистка ошибок.
rowsWithErrors(currRow).ClearErrors
Next currRow
End If
Next
End Sub
Доступ к данным с помощью объекта DataTable
Поскольку объект DataSet и содержащийся в нем объект DataTable всегда наполнены данными и не подключены к источнику данных, метод доступа к записям данных в них существенно отличается от методов доступа в ADO и других моделях доступа к данным (например, ODBC, DAO или RDO). Поскольку все данные доступны одновременно, в модели ADO.NET не существует понятия текущей записи. Поэтому нет никаких свойств или методов для перемещения от одной записи к другой. Каждый объект DataTable имеет свойство Rows, которое является набором объектов DataRow. Доступ к отдельному объекту осуществляется с помощью индекса или оператора For Each. Таким образом, в модели ADO.NET предлагается более простой и эффективный способ доступа и перемещения, аналогичный доступу к элементам массива.
В листинге 5.4 показан код подпрограммы DisplayDataSet, которая отображает содержимое ранее созданных таблиц с загруженными в них данными. В ней применяется циклический обход всех элементов коллекции, т.е. коллекций Rows и Columns, для отображения содержимого таблицы Employees. Далее используется альтернативный метод доступа к записям и полям с помощью числового индекса для отображения содержимого таблицы Departments.
ЛИСТИНГ 5.4. Код отображения данных в объектах DataTablePrivate Sub DisplayDataSet()
Dim dr As DataRow
Dim dc As DataColumn
Me.lstOutput.Items.Add("DISPLAY DATASET")
Me.lstOutput.Items.Add("============")
' Отображение данных из таблицы Employees.
For Each dr In dsEmployeeInfo.Tables("Employees").Rows
For Each dc In _
dsEmployeeInfo.Tables("Employees").Columns
Me.lstOutput.Items.Add( _
dc.ColumnName & ": " & dr(dc))
Next
Me.lstOutput.Items.Add ("============")
Next
Me.lstOutput.Items.Add("")
' Отображение данных из таблицы Departments.
' Пример использования индексов вместо оператора For Each.
Dim row As Integer
Dim col As Integer
For row = 0 To dsEmployeeInfo.Tables("Departments").Rows.Count – 1
For col = 0 To dsEmployeeInfo.Tables("Departments").Columns.Count – 1
Me.lstOutput.Items.Add( _
dsEmployeeInfo.Tables("Departments").Columns(col).ColumnName & ":" & _