Ограничениями называются правила, которые вводятся для поддержания целостности данных в таблице. В модели 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( _

Перейти на страницу:

Похожие книги