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