Ограничения таблиц данныхDataTable Constraints

Ограничения позволяют принудительно поддерживать целостность данных DataTable.You can use constraints to enforce restrictions on the data in a DataTable, in order to maintain the integrity of the data. Ограничение представляет собой автоматическое правило, применяемое к столбцу или связанным столбцам и определяющее порядок действий при каком-либо изменении содержимого строки.A constraint is an automatic rule, applied to a column or related columns, that determines the course of action when the value of a row is somehow altered. Ограничения применяются, если System.Data.DataSet.EnforceConstraints свойство DataSet объекта имеет значение true.Constraints are enforced when the System.Data.DataSet.EnforceConstraints property of the DataSet is true. Пример кода, показывающий, как установить свойство EnforceConstraints, см. в разделе справки EnforceConstraints.For a code example that shows how to set the EnforceConstraints property, see the EnforceConstraints reference topic.

В ADO.NET имеется два типа ограничений: ForeignKeyConstraint и UniqueConstraint.There are two kinds of constraints in ADO.NET: the ForeignKeyConstraint and the UniqueConstraint. По умолчанию оба ограничения создаются автоматически при создании связи между двумя или более таблицами путем добавления DataRelation в набор данных.By default, both constraints are created automatically when you create a relationship between two or more tables by adding a DataRelation to the DataSet. Однако это поведение можно отключить, указав креатеконстраинтс = false при создании связи.However, you can disable this behavior by specifying createConstraints = false when creating the relation.

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

ForeignKeyConstraint применяет правила, связанные с распространением обновлений и удалений в связанных таблицах.A ForeignKeyConstraint enforces rules about how updates and deletes to related tables are propagated. Например, если значение в строке одной таблицы Обновлено или удалено и это же значение также используется в одной или нескольких связанных таблицах, ForeignKeyConstraint определяет, что происходит в связанных таблицах.For example, if a value in a row of one table is updated or deleted, and that same value is also used in one or more related tables, a ForeignKeyConstraint determines what happens in the related tables.

Свойства DeleteRule и UpdateRule объекта ForeignKeyConstraint определяют действие, которое должно быть предпринято, когда пользователь пытается удалить или обновить строку в связанной таблице.The DeleteRule and UpdateRule properties of the ForeignKeyConstraint define the action to be taken when the user attempts to delete or update a row in a related table. В следующей таблице описаны различные параметры, доступные для свойств DeleteRule и UpdateRule объекта ForeignKeyConstraint.The following table describes the different settings available for the DeleteRule and UpdateRule properties of the ForeignKeyConstraint.

Установка правилRule setting ОписаниеDescription
CascadeCascade Удалить или обновить связанные строки.Delete or update related rows.
SetNullSetNull Задайте DBNullзначения в связанных строках.Set values in related rows to DBNull.
сетдефаултSetDefault Присвоить столбцам в связанных строках значение по умолчанию.Set values in related rows to the default value.
NoneNone Не выполнять никаких действий в связанных строках.Take no action on related rows. Это значение по умолчанию.This is the default.

ForeignKeyConstraint может ограничивать, а также распространять изменения в связанных столбцах.A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. В зависимости от свойств, заданных для объекта ForeignKeyConstraint столбца, если свойство енфорцеконстраинтс набора данных имеет значение true, выполнение определенных операций в родительской строке приведет к исключению.Depending on the properties set for the ForeignKeyConstraint of a column, if the EnforceConstraints property of the DataSet is true, performing certain operations on the parent row will result in an exception. Например, Если свойство объекта ForeignKeyConstraint имеет значение None, то родительская строка не может быть удалена, если она содержит дочерние строки.For example, if the DeleteRule property of the ForeignKeyConstraint is None, a parent row cannot be deleted if it has any child rows.

Ограничение внешнего ключа можно создать между отдельными столбцами или между массивами столбцов с помощью конструктора ForeignKeyConstraint .You can create a foreign key constraint between single columns or between an array of columns by using the ForeignKeyConstraint constructor. Передайте полученный объект ForeignKeyConstraint методу Add свойства Table rechecks , который является констраинтколлектион.Pass the resulting ForeignKeyConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. Можно также передать аргументы конструктора в несколько перегрузок метода Add объекта констраинтколлектион , чтобы создать объект ForeignKeyConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a ForeignKeyConstraint.

При создании ForeignKeyConstraintможно передать значения DeleteRule и UpdateRule в конструктор в качестве аргументов или задать их в качестве свойств, как показано в следующем примере (где значение DeleteRule равно Нет).When creating a ForeignKeyConstraint, you can pass the DeleteRule and UpdateRule values to the constructor as arguments, or you can set them as properties as in the following example (where the DeleteRule value is set to 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);  

Свойство AcceptRejectRuleAcceptRejectRule

Изменения в строках могут быть приняты с помощью метода AcceptChanges или отменены с помощью метода RejectChanges набора данных, DataTableили DataRow.Changes to rows can be accepted using the AcceptChanges method or canceled using the RejectChanges method of the DataSet, DataTable, or DataRow. Если набор данных содержит фореигнкэйконстраинтс, вызов методов AcceptChanges или RejectChanges применяет акцептрежектруле.When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. Свойство акцептрежектруле объекта ForeignKeyConstraint определяет, какое действие будет выполнено с дочерними строками при вызове метода AcceptChanges или RejectChanges в родительской строке.The AcceptRejectRule property of the ForeignKeyConstraint determines which action will be taken on the child rows when AcceptChanges or RejectChanges is called on the parent row.

В следующей таблице перечислены доступные параметры для акцептрежектруле.The following table lists the available settings for the AcceptRejectRule.

Установка правилRule setting ОписаниеDescription
CascadeCascade Принять или отклонить изменения в дочерних строках.Accept or reject changes to child rows.
NoneNone Не выполнять никаких действий в дочерних строках.Take no action on child rows. Это значение по умолчанию.This is the default.

ПримерExample

В следующем примере создается ограничение ForeignKeyConstraint, устанавливаются некоторые из его свойств, в том числе AcceptRejectRule, а само ограничение добавляется в коллекцию ConstraintCollection объекта DataTable.The following example creates a ForeignKeyConstraint, sets several of its properties, including the AcceptRejectRule, and adds it to the ConstraintCollection of a DataTable object.

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;
}
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

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

Объект UniqueConstraint , который может быть назначен одному столбцу или массиву столбцов в DataTable, гарантирует, что все данные в указанном столбце или столбцах уникальны для каждой строки.The UniqueConstraint object, which can be assigned either to a single column or to an array of columns in a DataTable, ensures that all data in the specified column or columns is unique per row. Можно создать ограничение уникальности для столбца или массива столбцов с помощью конструктора UniqueConstraint .You can create a unique constraint for a column or array of columns by using the UniqueConstraint constructor. Передайте полученный объект UniqueConstraint в метод Add свойства ограничения таблицы, которое является констраинтколлектион.Pass the resulting UniqueConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. Можно также передать аргументы конструктора в несколько перегрузок метода Add объекта констраинтколлектион , чтобы создать UniqueConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a UniqueConstraint. При создании UniqueConstraint для столбца или столбцов можно дополнительно указать, является ли столбец или столбцы первичным ключом.When creating a UniqueConstraint for a column or columns, you can optionally specify whether the column or columns are a primary key.

Можно также создать ограничение уникальности для столбца, задав свойству UNIQUE столбца значение true.You can also create a unique constraint for a column by setting the Unique property of the column to true. Кроме того, если задать для свойства UNIQUE одного столбца значение false , то все ограничения уникальности, которые могут существовать, будут удалены.Alternatively, setting the Unique property of a single column to false removes any unique constraint that may exist. При определении столбца или группы столбцов в качестве первичного ключа таблицы автоматически создается ограничение уникальности для заданного столбца или группы столбцов.Defining a column or columns as the primary key for a table will automatically create a unique constraint for the specified column or columns. Если удалить столбец из свойства PrimaryKey объекта DataTable, UniqueConstraint будет удален.If you remove a column from the PrimaryKey property of a DataTable, the UniqueConstraint is removed.

В следующем примере создается UniqueConstraint для двух столбцов таблицы DataTable.The following example creates a UniqueConstraint for two columns of a 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);  

См. такжеSee also