Категории
Самые читаемые
Лучшие книги » Компьютеры и Интернет » Программирование » Обработка баз данных на Visual Basic®.NET - Джеффри Мак-Манус

Обработка баз данных на Visual Basic®.NET - Джеффри Мак-Манус

Читать онлайн Обработка баз данных на Visual Basic®.NET - Джеффри Мак-Манус

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 45 46 47 48 49 50 51 52 53 ... 88
Перейти на страницу:

После создания отношения между таблицами можно организовать доступ к связанным данным в них. Начните с создания кнопки и вставки кода, приведенного в листинге 5.7.

1. Создайте новую кнопку непосредственно под кнопкой Create Relations, перетаскивая ее из панели элементов управления.

2. В окне свойств Properties укажите значение btnChildRows для свойства (Name) и значение Child Rows для свойства Text.

3. Вставьте код, показанный в листинге 5.7.

Листинг 5.7. Код отображения родительских и дочерних данных из связанных таблиц

Private Sub btnChildRows_Click(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) Handles btnChildRows.Click

 Dim rel As DataRelation CreateDataSet()

 AddData()

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

 rel = dsEmployeeInfо.Relations.Add("relDepartmentEmployees", _

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

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

 DisplayChildRows(dsEmployeeInfo.Tables("Departments"))

End Sub

Private Sub DisplayChidRows(ByVal dt As DataTable)

 Dim rel As DataRelation

 Dim relatedRows() As DataRow

 Dim row As DataRow

 Dim col As DataColumn

 Dim i As Integer

 Dim rowData As String

 Me.lstOutput.Items.Add("")

 Me.lstOutput.Items.Add("CHILD ROWS")

 For Each row In dt.Rows

  For Each rel In dt.ChildRelations

   Me.lstOutput.Items.Add(_

    dt.TableName & ": " & _

    rel.ParentColumns(0).ColumnName & _

    "= " & row(rel.ParentColumns(0).ToString))

   relatedRows = row.GetChildRows(rel)

   ' Вывод значений записей.

   For i = 0 To relatedRows.GetUpperBound(0)

    rowData = "****" & _

     rel.ChildTable.TableName & ":"

    For Each col In rel.ChildTable.Columns

     rowData = rowData & " " & _

     relatedRows(i)(col.ToString)

    Next col

    Me.lstOutput.Items.Add(rowData)

   Next i

  Next rel

 Next row

End Sub

Подпрограмма btnChildRows_Click для обработки щелчков на кнопке Child Rows сначала создает объект DataSet и объекты DataTable с помощью подпрограммы CreateDataSet (код которой приведен в листинге 5.1), а затем наполняет их данными с помощью подпрограммы AddData (код которой приведен в листинге 5.2). После этого между таблицами Employees и Departments создается отношение с помощью кода, который приведен в листинге 5.6. Наконец, для вывода данных из записей в текстовом поле формы вызывается подпрограмма DisplayChildRows, которой в качестве аргумента (родительской таблицы) передается таблица Departments.

Подпрограмма DisplayChildRows содержит трижды вложенный цикл для отображения всех полей из каждой связанной дочерней таблицы (в данном случае только одной) для каждой записи родительской таблицы. При этом каждая запись родительской таблицы передается циклу как аргумент, происходит обход всех отношений, определенных в свойстве ChildRelations таблицы, отображается имя таблицы, имя поля в родительской таблице, а также значение поля в текущей записи. Затем вызывается метод GetChildRows с текущим отношением в качестве аргумента и возвращается массив объектов DataRow, содержащих дочерние записи. Для каждой записи отображаются все поля с префиксами в виде четырех звездочек и имени дочерней таблицы.

НА ЗАМЕТКУ

Некоторые версии метода GetChildRows принимают дополнительный аргумент, который указывает на используемую версию возвращаемых записей с помощью членов перечисления DataRowVersion из табл. 5.2. Аналогичные методы предусмотрены для извлечения родительской записи (или нескольких родительских записей) по заданной дочерней записи.

Здесь у читателя может возникнуть вопрос: почему упоминается несколько родительских записей? Разве дочерняя запись может иметь несколько родительских записей? Дело в том, что кроме родительских полей, заданных на основе полей с уникальными значениями, могут создаваться родительские поля на основе полей с повторяющимися значениями. Поэтому в таких случаях вместо одной родительской записи (GetParentRow) приходится извлекать несколько родительских (GetParentRows).

РИС. 5.3. Результаты отображения родительских и дочерних записей из таблиц Employees и Departments

После компоновки проекта DataSetCode и запуска полученного приложения щелкните на кнопке Child ROWS, и в текстовом поле будут выведены значения всех родительских записей из таблицы Employees для каждой родительской записи из таблицы Departments (рис. 5.3).

Ограничения

Ограничениями называются правила, которые вводятся для поддержания целостности данных в таблице. В модели ADO.NET применяется два типа ограничений целостности данных: UniqueConstraint и ForeignKeyConstraint. Ограничение UniqueConstraint гарантирует, что все значения в указанных полях будут уникальны в рамках всей таблицы. Ограничение ForeignKeyConstraint определяет связь на основе первичного и внешнего ключа в двух таблицах и выполняемые действия в случае добавления, удаления или изменения родительской записи (т.е. первичного ключа). При нарушении заданных ограничений генерируется исключительная ситуация.

Учтите, что ограничения применяются только тогда, когда свойство EnforceConstraints объекта DataSet имеет значение True, которое используется по умолчанию.

Хотя ограничения можно создавать непосредственно, довольно часто они создаются косвенно. Фактически в приведенном ранее примере уже было создано несколько ограничений. Объект UniqueConstraint автоматически создается и включается в коллекцию Constraints объекта DataTable, если для свойства Unique объекта DataColumn задано значение True. Кроме того, объекты UniqueConstraint и ForeignKeyConstraint автоматически создаются при создании отношения между двумя таблицами. В таком случае объект UniqueConstraint создается для связанных полей в родительской таблице, а объект ForeignKeyConstraint — для связанных полей в дочерней таблице.

НА ЗАМЕТКУ

Конечно, объект DataRelation можно создать без определения ограничений, но эффективность такого способа весьма спорна.

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

1. Создайте новую кнопку непосредственно под кнопкой Child ROWS, перетаскивая ее из панели элементов управления.

2. В окне свойств Properties укажите значение btnConstraints для свойства (Name) и значение Constraints для свойства Text.

3. Вставьте код, показанный в листинге 5.8.

Листинг 5.8. Код отображения ограничений

Private Sub btnConstraints_Click(ByVal sender As _

 System.Object, ByVal e As System.EventArgs) _

 Handles btnConstraints.Click

 Dim dt As DataTable Dim rel As DataRelation

 CreateDataSet()

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

 rel = dsEmployeeInfo.Relations.Add(_

  "relDepartmentEmployees", _

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

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

 For Each dt In dsEmployeeInfo.Tables

  DisplayConstraints(dt)

 Next dt

End Sub

Private Sub DisplayConstraints(ByVal dt As DataTable)

 Dim i As Integer

 Dim cs As Constraint

 Dim uCS As UniqueConstraint

 Dim fkCS As ForeignKeyConstraint

 Dim columns() As DataColumn

 Me.lstOutput.Items.Add("")

 Me.lstOutput.Items.Add( _

  "CONSTRAINTS FOR TABLE: " & dt.TableName)

 Me.lstOutput.Items.Add( _

 "====================================")

 For Each cs In dt.Constraints

  Me.lstOutput.Items.Add( _

   "Constraint Name: " & cs.ConstraintName)

  Me.lstOutput.Items.Add( _

   "Type: " & cs.GetType().ToString())

  If TypeOf cs Is UniqueConstraint Then

   uCS = CType(cs, UniqueConstraint)

   ' Обработка полей в виде массива

   columns = uCS.Columns

   ' Вывод имен полей.

   For i = 0 То columns.Length – 1

    Me.lstOutput.Items.Add( _

     "Column Name: " & columns(i).ColumnName)

   Next i

  ElseIf TypeOf cs Is ForeignKeyConstraint Then

   fkCS = CType(cs, ForeignKeyConstraint)

   ' Обработка дочерних полей и вывод их имён

   columns = fkCS.Columns

   For i = 0 To columns.Length – 1

    Me.lstOutput.Items.Add( _

     "Column Name: " & columns(i).ColumnName)

   Next i

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

   Me.lstOutput.Items.Add( _

    "Related Table Name: " & _

    fkCS.RelatedTable.TableName)

   ' Обработка связанных родительских полей и вывод их имен

   columns = fkCS.RelatedColumns

   For i = 0 То columns.Length – 1

    Me.lstOutput.Items.Add( _

    "Related Column Name: " & _

    columns(i).ColumnName)

   Next i

  End If

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

 Next cs

End Sub

Подпрограмма btnConstraints_Click обрабатывает щелчки на кнопке Constraints: создает объекты DataSet, DataTable и DataRelation (с помощью кода из прежних листингов), а затем вызывает подпрограмму DisplayConstraints для отображения информации о созданных ограничениях.

1 ... 45 46 47 48 49 50 51 52 53 ... 88
Перейти на страницу:
На этой странице вы можете бесплатно скачать Обработка баз данных на Visual Basic®.NET - Джеффри Мак-Манус торрент бесплатно.
Комментарии