Выбрать главу

    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.

После определения первичного ключа метод Find используется так, как показано ниже.

Dim desiredRow As DataRow

desiredRow = dtDepartments.Rows.Find("sales")

Здесь переменной desiredRow присваивается объект DataRow с указанным значением первичного ключа или значение Nothing, если такая запись не будет найдена.

Если первичный ключ таблицы основан на нескольких полях, то соответствующие значения первичного ключа передаются в виде элементов массива (типа Object) методу Find.

' Указание первичного ключа.

Dim pk(0) As DataColumn

pk(0) = dtEmployees.Columns("FirstName")

pk(1) = dtEmployees.Columns("LastName")

dtEmployees.PrimaryKey = pk

' Попытка поиска нужной записи.

Dim desiredRow As DataRow

Dim desiredValues (1) As Object

desiredValues(0) = "Sam"

desiredValues(1) = "Johnson"

desiredRow = dtEmployees.Rows.Find(desiredValues)

Метод Select объекта DataTable возвращает массив объектов DataRow. Возвращаемые строки могут соответствовать критерию фильтрования, порядку сортировки и/или спецификации состояния (объект DataViewRowState пространства имен System.Data).

Приведенный ниже код возвращает и отображает имена всех сотрудников с фамилией Johnson.

Dim selectedRows () As DataRow

selectedRows = dtEmployees.Select("LastName = 'Johnson'")

Dim i As Integer

For i = 0 to selectedRows.GetUpperBound(0)

 MessageBox.Show(selectedRows(i)("FirstName"))

Next

Для возврата записей, отсортированных в порядке убывания, можно отредактировать строку с методом Select так, как показано ниже.

selectedRows = dtEmployees. Select ("LastName = 'Johnson'", "FirstName DESC")

Наконец, указание состояния записи в качестве аргумента метода Select позволяет извлекать записи с определенной версией данных непосредственно в процессе их редактирования. Например, для извлечения всех исходных значений записей даже после их редактирования (но еще до вызова метода AcceptChanges) следует указать значение OriginalRows перечисления DataViewRowState, как показано ниже.