Поделиться через


Ограничения DataTable (ADO.NET)

Ограничения позволяют принудительно поддерживать целостность данных DataTable. Ограничение представляет собой автоматическое правило, применяемое к столбцу или связанным столбцам и определяющее порядок действий при каком-либо изменении содержимого строки. Ограничения применяются в том случае, если свойство System.Data.DataSet.EnforceConstraints объектаDataSet имеет значение true. Пример кода, показывающий, как установить свойство EnforceConstraints, см. в разделе справки EnforceConstraints.

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

Ограничение ForeignKeyConstraint

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

Свойства DeleteRule и UpdateRule ограничения ForeignKeyConstraint задают действие, которое должно быть выполнено, когда пользователь пытается удалить или обновить строку в связанной таблице. В следующей таблице приведены настройки, доступные для свойств DeleteRule и UpdateRule ограничения ForeignKeyConstraint.

Установка правил

Описание

Cascade

Удалить или обновить связанные строки.

SetNull

Присвоить столбцам в связанных строках значение DBNull.

SetDefault

Присвоить столбцам в связанных строках значение по умолчанию.

None

Не выполнять никаких действий в связанных строках. Это значение по умолчанию.

ForeignKeyConstraint может ограничивать или распространять изменения на связанные столбцы. В зависимости от свойств, заданных для ограничения ForeignKeyConstraint столбца, при значении свойства EnforceConstraints для DataSet, равном true, определенные операции в родительских строках приведут к возникновению исключения. Например, если свойство DeleteRule ограничения ForeignKeyConstraint имеет значение None, родительскую строку нельзя удалять, если у нее имеются дочерние строки.

Можно создать ограничение внешнего ключа между отдельными столбцами или массивом столбцов с помощью конструктора ForeignKeyConstraint. Передайте объект ForeignKeyConstraint методу Add свойства таблицы Constraints, которое представляет собой объект ConstraintCollection. Для создания ограничения ForeignKeyConstraint можно также передать аргументы конструктора одному из нескольких перегруженных методов Add коллекции ConstraintCollection.

При создании ограничения ForeignKeyConstraint можно передать конструктору значения DeleteRule и UpdateRule в качестве аргументов или задать их в виде свойств, как показано в следующем примере (где значение DeleteRule равно None).

Dim custOrderFK As ForeignKeyConstraint = New ForeignKeyConstraint("CustOrderFK", _
  custDS.Tables("CustTable").Columns("CustomerID"), _
  custDS.Tables("OrdersTable").Columns("CustomerID"))
custOrderFK.DeleteRule = Rule.None  
' Cannot delete a customer value that has associated existing orders.
custDS.Tables("OrdersTable").Constraints.Add(custOrderFK)
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
  custDS.Tables["CustTable"].Columns["CustomerID"], 
  custDS.Tables["OrdersTable"].Columns["CustomerID"]);
custOrderFK.DeleteRule = Rule.None;  
// Cannot delete a customer value that has associated existing orders.
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);

Свойство AcceptRejectRule

Изменения строк можно принять, используя метод AcceptChanges, или отменить с помощью метода RejectChanges для DataSet, DataTable или DataRow. Если DataSet содержит ограничение ForeignKeyConstraints, вызов методов AcceptChanges и RejectChanges применяет свойство AcceptRejectRule. Свойство AcceptRejectRule ограничения ForeignKeyConstraint определяет, какие действия следует предпринять в дочерних строках, если в родительской строке вызывается метод AcceptChanges или RejectChanges.

В следующей таблице перечислены доступные настройки AcceptRejectRule.

Установка правил

Описание

Cascade

Принять или отклонить изменения в дочерних строках.

None

Не выполнять никаких действий в дочерних строках. Это значение по умолчанию.

Пример

В следующем примере создается ограничение ForeignKeyConstraint, устанавливаются некоторые из его свойств, в том числе AcceptRejectRule, а само ограничение добавляется в коллекцию ConstraintCollection объекта DataTable.

Private Sub CreateConstraint(dataSet As DataSet, _
   table1 As String, table2 As String, _
   column1 As String, column2 As String)

   ' Declare parent column and child column variables.
   Dim parentColumn As DataColumn
   Dim childColumn As DataColumn
   Dim foreignKeyConstraint As ForeignKeyConstraint

   ' Set parent and child column variables.
   parentColumn = dataSet.Tables(table1).Columns(column1)
   childColumn = dataSet.Tables(table2).Columns(column2)
   foreignKeyConstraint = New ForeignKeyConstraint _
      ("SupplierForeignKeyConstraint", parentColumn, childColumn)

   ' Set null values when a value is deleted.
   foreignKeyConstraint.DeleteRule = Rule.SetNull
   foreignKeyConstraint.UpdateRule = Rule.Cascade
   foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule.None

   ' Add the constraint, and set EnforceConstraints to true.
   dataSet.Tables(table1).Constraints.Add(foreignKeyConstraint)
   dataSet.EnforceConstraints = True
End Sub
private void CreateConstraint(DataSet dataSet, 
    string table1, string table2,string column1, string column2)
{
   // Declare parent column and child column variables.
   DataColumn parentColumn;
   DataColumn childColumn;
   ForeignKeyConstraint foreignKeyConstraint;

   // Set parent and child column variables.
   parentColumn = dataSet.Tables[table1].Columns[column1];
   childColumn = dataSet.Tables[table2].Columns[column2];
   foreignKeyConstraint = new ForeignKeyConstraint
      ("SupplierForeignKeyConstraint",  parentColumn, childColumn);

   // Set null values when a value is deleted.
   foreignKeyConstraint.DeleteRule = Rule.SetNull;
   foreignKeyConstraint.UpdateRule = Rule.Cascade;
   foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule.None;

   // Add the constraint, and set EnforceConstraints to true.
   dataSet.Tables[table1].Constraints.Add(foreignKeyConstraint);
   dataSet.EnforceConstraints = true;
}

Ограничение UniqueConstraint

Объект UniqueConstraint, назначаемый или отдельному столбцу, или массиву столбцов в наборе данных DataTable, обеспечивает уникальность всех данных заданного столбца или столбцов для одной строки. Можно создать ограничение уникальности для столбца или массива столбцов с помощью конструктора UniqueConstraint. Передайте объект UniqueConstraint методу Add свойства таблицы Constraints, которое представляет собой коллекцию ConstraintCollection. Для создания ограничения UniqueConstraint можно также передать аргументы конструктора одному из нескольких перегруженных методов Add коллекции ConstraintCollection. При создании ограничения UniqueConstraint для одного или нескольких столбцов можно по желанию указать, является ли этот столбец или группа столбцов первичным ключом.

Можно также создать ограничение уникальности для столбца, присвоив его свойству Unique значение true. Либо, присвоив свойству Unique одного столбца значение false, можно удалить любое существующее ограничение уникальности. При определении столбца или группы столбцов в качестве первичного ключа таблицы автоматически создается ограничение уникальности для заданного столбца или группы столбцов. Если удалить столбец из свойства PrimaryKey для DataTable, ограничение UniqueConstraint удаляется.

В следующем примере создается ограничение UniqueConstraint для двух столбцов DataTable.

Dim custTable As DataTable = custDS.Tables("Customers")
Dim custUnique As UniqueConstraint = _
    New UniqueConstraint(New DataColumn()   {custTable.Columns("CustomerID"), _
    custTable.Columns("CompanyName")})
custDS.Tables("Customers").Constraints.Add(custUnique)
DataTable custTable = custDS.Tables["Customers"];
UniqueConstraint custUnique = new UniqueConstraint(new DataColumn[] 
    {custTable.Columns["CustomerID"], 
    custTable.Columns["CompanyName"]});
custDS.Tables["Customers"].Constraints.Add(custUnique);

См. также

Ссылки

DataRelation

DataTable

ForeignKeyConstraint

UniqueConstraint

Другие ресурсы

Определение схемы DataTable (ADO.NET)

Объекты DataSet, DataTable и DataView (ADO.NET)