Чтение онлайн

ЖАНРЫ

Обработка баз данных на Visual Basic®.NET

Прайс Кевин Т.

Шрифт:

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. Код отображения данных в объектах DataTable

Private 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 & ":" & _

dsEmployeeInfo.Tables("Departments").Rows(row)(col))

Next col

Me.lstOutput.Items.Add("============")

 Next row

End Sub

Аналогично можно создать подпрограмму более общего типа для обхода не только записей и полей, но и таблиц объекта DataSet, как показано в листинге 5.5.

ЛИСТИНГ 5.5. Код обхода таблиц из объекта DataSet

Private Sub DisplayDataSet(ByVal ds As DataSet)

 ' Общая подпрограмма для отображения содержимого объекта DataSet.

 ' Отображаемый объект DataSet передается как параметр.

 Dim dt As DataTable

 Dim dr As DataRow

 Dim dc As DataColumn

 Me.lstOutput.Items.Add("DISPLAY DATASET")

 Me.lstOutput.Items.Add("============")

 For Each dt In ds.Tables

Me.lstOutput.Items.Add(")

Me. lstOutput.Items.Add("TABLE: " & dt.TableName)

Me.lstOutput.Items.Add(" ")

For Each dr In dt. Rows

For Each dc In dt.Columns

Me.lstOutput.Items.Add(dc.ColumnName S ": " & dr(dc))

Next

Me.lstOutput.Items.Add ("============")

Next

 Next dt

End Sub

Обратите

внимание, что здесь перегружается уже упомянутый ранее метод DisplayDataSet, который теперь принимает в качестве параметра объект DataSet.

Попробуйте запустить полученное приложение; для этого введите упомянутый ранее код в проект DataSetCode и щелкните на кнопке Create DataSet. В результате этого действия создается объект DataSet и наполняется данными, которые затем отображаются в текстовом поле формы, как показано на рис. 5.2.

РИС. 5.2. Результат создания объекта DataSet с таблицами Employees и Departments, наполнения их данными и последующего отображения

НА ЗАМЕТКУ

Для проверки обобщенной версии подпрограммы DisplayDataSet в подпрограмме btnCreateDS_Click следует заменить вызов ее исходной версии DisplayDataSet новой перегруженной версией DisplayDataSet(dsEmployeeInfо) с параметром dsEmployeeInfo.

Поиск, фильтрация и сортировка записей

Иногда нужно работать не со всеми, а только с некоторыми записями объекта DataSet, например с одной записью или подмножеством всех записей. Для этого можно использовать методы Find и Select.

Метод Find принадлежит свойству DataRowCollection объекта DataTable, который используется для поиска и возвращения единственной строки, указанной с помощью значения первичного ключа таблицы.

Перед использованием метода Find для обнаружения некоторой строки в таблице Departments, которая определена в листинге 5.1, нужно определить первичный ключ таблицы. Это можно сделать с помощью присвоения одного или нескольких полей свойству PrimaryKey таблицы. (Даже если первичный ключ создан на основе единственного поля, свойство PrimaryKey таблицы является массивом объектов DataColumn.)

В приведенных ниже строках кода, которые следует добавить в конце подпрограммы CreateDataSet из листинга 5.1, первичный ключ таблицы Departments создается на основе поля DepartmentName.

Dim pk(0) As DataColumn

pk(0) = dtDepartments.Columns("DepartmentName")

dtDepartments.PrimaryKey = pk

НА ЗАМЕТКУ

При создании первичного ключа с помощью свойства PrimaryKey для объекта DataTable на основе одного поля для свойства AllowDBNull этого поля автоматически задается значение False, а для свойства Unique — значение True. А если первичный ключ создан на основе нескольких полей, то только для свойства AllowDBNull этих полей автоматически задается значение False.

Поделиться с друзьями: