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

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

 Dim As DataRelation

 CreateDataSet()

 ' Создание отношения между таблицами Departments и Employees.

 rel = dsEmployeeInfо.Relations.Add(_

  "relDepartmentEmployees", _

  dsEmployeeInfo.Tables("Departments").Columns("ID"), _

  dsEmployeeInfo.Tables("Employees").Columns("DepartmentID"))

 DisplayRelations(dsEmployeeInfo)

End Sub

Private Sub DisplayRelations(ByVal ds As DataSet)

 Dim rel As DataRelation

'  Вывод имен полей созданного отношения.

 Me.lstOutput.Items.Add("")

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

 For Each rel In ds.Relations

  ' Вывод имени отношения.

  Me.lstOutput.Items.Add("NAME: " & rel.RelationName)

  ' Вывод имени родительской таблицы и ее поля,

  ' которое входит в созданное отношение.

  Me.IstOutput.Items.Add("PARENT: " & _

   rel.ParentTable.ToString & " – " & _

   rel.ParentColumns(0).ColumnName)

  ' Вывод имени дочерней таблицы и ее поля,

  ' которое входит в созданное отношение.

  Me.lstOutput.Items.Add("CHILD: " & _

   rel.ChildTable.ToString & " – " & _

   rel.ChildColumns(0).ColumnName)

 Next

 Me.lstOutput.Items.Add("")

End Sub

Сначала нужно создать объект DataRelation. Каждый объект DataSet содержит коллекцию отношений, которая доступна как свойство этого объекта Relations. Это свойство имеет тип DataRelationCollection и поддерживает несколько перегруженных версий метода Add. Версия, использованная в листинге 5.6, принимает три аргумента: имя отношения, ссылку на объект DataColumn в родительской таблице, а также ссылку на объект DataColumn в дочерней таблице. Если отношение между таблицами охватывает более одного поля, то следует использовать другую версию метода Add с аргументами-массивами объектов DataColumn.