' Указание первичного ключа.
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, как показано ниже.
selectedRows = dtEmployees.Select(Nothing, Nothing, DataViewRowState.OriginalRows)
Для отбора вновь добавленных записей с фамилией Johnson следует указать значение Added перечисления DataViewRowState, как показано ниже.
selectedRows = dtEmployees. Select ("LastName = 'Johnson'", Nothing, DataViewRowState.Added)
А если нужно отобрать вновь добавленные записи с фамилией Johnson и отсортировать их по имени, то в таком случае следует использовать приведенный ниже код.
selectedRows = dtEmployees.Select("LastName = 'Johnson'", "FirstName DESC", DataViewRowState.Added)
В табл. 5.3 приведены все возможные варианты состояния записи, которые могут быть представлены членами перечисления DataViewRowState. Упомянутые здесь изменения связаны с последней загрузкой данных или вызовом метода АcсеptChanges.
Таблица 5.3. Члены перечисления DataViewRowState
Член |
Описание |
Added |
Вновь созданные записи |
CurrentRows |
Все текущие записи (включая новые, измененные или неизмененные записи) |
Deleted |
Все записи, отмеченные как удаленные |
ModifiedCurrent |
Текущая версия измененной записи |
ModifiedOriginal |
Исходная версия измененной записи |
None |
Нет сведений |
OriginalRows |
Все исходные записи, включая неизмененные и удаленные, кроме новых записей |
Unchanged |
Все неизмененные записи |
Отношения между таблицами
Поскольку объект DataSet может содержать несколько таблиц, то вполне естественно, что между ними могут существовать какие-то отношения (по крайней мере, если речь идет о реляционных базах данных). В модели ADO.NET для этого предусмотрен объект DataRelation.
Объект DataRelation устанавливает соответствие между полями в двух таблицах, которые имеют родительско-дочерние отношения или связаны первичным и внешним ключами. Классический пример такого отношения существует между таблицами с данными о клиентах и с данными о заказах, где одна запись клиента может быть связана с несколькими записями его заказов. Запись клиента является родительской, а записи заказов — дочерними. Продолжим обсуждение этой темы на примере родительской таблицы Department и дочерней таблицы Employees, которые находятся в одном объекте DataSet.
Объект DataRelation выполняет две разные функции.
• Позволяет переходить от одной связанной таблицы к другой и обратно, т.е. при работе с родительской записью можно получить доступ к ее дочерним записям, а при работе с дочерней записью — доступ к ее родительской записи.
• Позволяет задавать и поддерживать ссылочную целостность, например каскадные обновления данных в связанных таблицах при выполнении каких-либо изменений в любой из связанных таблиц.
Продолжим работу с упомянутым ранее проектом DataSetCode.
1. Создайте новую кнопку непосредственно под кнопкой Create DataSet, перетаскивая ее из панели элементов управления.
2. В окне свойств Properties укажите значение btnCreateRelations для свойства (Name) и значение Create Relations для свойства Text.
3. Вставьте код, показанный в листинге 5.6.
Листинг 5.6. Код создания и отображения отношений между таблицами
Private Sub btnCreateRelations_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnCreateRelations.Click
Читать дальше