Книга: Обработка баз данных на Visual Basic®.NET

Ограничения

Ограничения

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

Подпрограмма общего типа DisplayConstraints принимает в качестве параметра объект DataTable и отображает информацию об ограничениях указанной таблицы. Для этого выполняется циклический обход всех членов свойства-коллекции Constraints указанной таблицы. Каждое найденное ограничение проверяется, т.е. выясняется, имеет ли оно тип UniqueConstraint или ForeignKeyConstraint. Оба они являются производными классами от класса Constraint, поэтому могут сосуществовать в рамках одной типизированной коллекции. Однако эти объекты все же обладают разным набором свойств, поэтому разработчику потребуется идентифицировать тип ограничения в коллекции и преобразовать его к соответствующему уточненному типу. Для ограничения UniqueConstraint отображаются имена всех (одного или нескольких) полей, определенных в данном ограничении. А для ограничения ForeignKeyConstraint отображается имя связанной родительской таблицы вместе с именами всех (одного или нескольких) связанных полей в этой таблице.


РИС. 5.4. Результаты отображения информации о созданных ограничениях для таблиц Employees и Departments

После компоновки проекта DataSetCode и запуска полученного приложения щелкните на кнопке Constraints, и в текстовом поле будет выведена информация о созданных ограничениях (рис. 5.4). Учтите, что все три показанных ограничения (одно для таблицы Employees и два для таблицы Departments) созданы автоматически, так как во время создания отношения между таблицами для свойства Unique объекта DataColumn задано значение True.

Объект ForeignKeyConstraint имеет три свойства-правила, которые управляют действиями, предпринимаемыми при редактировании данных в связанных таблицах. Например, свойства UpdateRule и DeleteRule определяют действия, выполняемые при обновлении и удалении записей в родительской таблице. Эти свойства могут принимать одно из значений перечисления Rule, члены которого описаны в табл. 5.4.

Таблица 5.4. Члены перечисления Rule 

Член перечисления Описание
Cascade Удаление или обновление данных в родительской записи также выполняется для связанных дочерних записей. Это значение используется по умолчанию
None Удаление или обновление данных в родительской записи не выполняется для связанных дочерних записей. Это может привести к появлению дочерних записей, которые ошибочно ссылаются на отсутствующие родительские записи
SetDefault Удаление или обновление данных в родительской записи не выполняется для связанных дочерних записей, но для них задается используемое по умолчанию значение, указанное в свойстве DefaultValue
SetNull Удаление или обновление данных в родительской записи не выполняется для связанных дочерних записей, но для них задается значение DBNull

Еще одно свойство AcceptRejectRule может принимать значения Cascade (или None) при вызове метода AcceptChanges (или RejectChanges) для связанных дочерних записей. По умолчанию для него используется значение Cascade, которое указывает на автоматический вызов методов AcceptChanges или RejectChanges для дочерних записей при вызове этих методов для связанной с ними родительской записи. Если свойство AcceptRejectRule имеет значение None, то вызов одного из этих двух методов для родительской записи никак не повлияет на связанные с ней дочерние записи.

Оглавление книги


Генерация: 0.084. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз