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, то вызов одного из этих двух методов для родительской записи никак не повлияет на связанные с ней дочерние записи.
Читать дальше