Ograniczenia elementu DataTableDataTable Constraints

Możesz użyć ograniczeń, aby wymusić ograniczenia dotyczące danych w DataTable , aby zachować integralność danych.You can use constraints to enforce restrictions on the data in a DataTable, in order to maintain the integrity of the data. Ograniczenie jest automatyczną regułą stosowaną do kolumny lub powiązanych kolumn, która określa przebieg akcji, gdy wartość wiersza jest zmieniana.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. Ograniczenia są wymuszane, gdy System.Data.DataSet.EnforceConstraints Właściwość DataSet ma wartość true.Constraints are enforced when the System.Data.DataSet.EnforceConstraints property of the DataSet is true. Przykładowy kod, który pokazuje, jak ustawić EnforceConstraints Właściwość, można znaleźć w EnforceConstraints temacie Reference.For a code example that shows how to set the EnforceConstraints property, see the EnforceConstraints reference topic.

Istnieją dwa rodzaje ograniczeń w ADO.NET: ForeignKeyConstraint i UniqueConstraint .There are two kinds of constraints in ADO.NET: the ForeignKeyConstraint and the UniqueConstraint. Domyślnie oba ograniczenia są tworzone automatycznie podczas tworzenia relacji między dwiema lub wieloma tabelami przez dodanie DataRelation do zestawu danych.By default, both constraints are created automatically when you create a relationship between two or more tables by adding a DataRelation to the DataSet. Takie zachowanie można jednak wyłączyć, określając wartość w polu Wyłącz ograniczenia = false podczas tworzenia relacji.However, you can disable this behavior by specifying createConstraints = false when creating the relation.

Element ForeignKeyConstraintForeignKeyConstraint

Element ForeignKeyConstraint wymusza reguły dotyczące sposobu propagacji aktualizacji i usunięć do powiązanych tabel.A ForeignKeyConstraint enforces rules about how updates and deletes to related tables are propagated. Na przykład, jeśli wartość w wierszu jednej tabeli jest aktualizowana lub usuwana, a ta sama wartość jest również używana w co najmniej jednej pokrewnych tabelach, element ForeignKeyConstraint określa, co się dzieje w tabelach pokrewnych.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.

DeleteRuleWłaściwości i UpdateRule element ForeignKeyConstraint definiują akcję do wykonania, gdy użytkownik próbuje usunąć lub zaktualizować wiersz w powiązanej tabeli.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. W poniższej tabeli opisano różne ustawienia dostępne dla właściwości DeleteRule i UpdateRule element ForeignKeyConstraint.The following table describes the different settings available for the DeleteRule and UpdateRule properties of the ForeignKeyConstraint.

Ustawienie regułyRule setting OpisDescription
CascadeCascade Usuń lub zaktualizuj powiązane wiersze.Delete or update related rows.
SetNullSetNull Ustaw wartości w powiązanych wierszach na wartość DBNull.Set values in related rows to DBNull.
SetDefaultSetDefault Ustaw wartości domyślne w powiązanych wierszach.Set values in related rows to the default value.
BrakNone Nie podejmuj żadnych działań w odniesieniu do powiązanych wierszy.Take no action on related rows. Jest to opcja domyślna.This is the default.

Element ForeignKeyConstraint może ograniczyć, a także propagowanie zmian w powiązanych kolumnach.A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. W zależności od właściwości ustawionych dla element ForeignKeyConstraint kolumny, jeśli właściwość EnforceConstraints zestawu danych ma wartość true, wykonanie niektórych operacji w wierszu nadrzędnym spowoduje wyjątek.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. Na przykład jeśli właściwość DeleteRule elementu element ForeignKeyConstraint ma wartość None, nie można usunąć wiersza nadrzędnego, jeśli ma on wszystkie wiersze podrzędne.For example, if the DeleteRule property of the ForeignKeyConstraint is None, a parent row cannot be deleted if it has any child rows.

Można utworzyć ograniczenie klucza obcego między pojedynczymi kolumnami lub między tablicami kolumn za pomocą konstruktora element ForeignKeyConstraint .You can create a foreign key constraint between single columns or between an array of columns by using the ForeignKeyConstraint constructor. Przekaż otrzymany obiekt element ForeignKeyConstraint do metody Add właściwości ograniczenia tabeli, która jest elementem ConstraintCollection.Pass the resulting ForeignKeyConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. Można również przekazać argumenty konstruktora do kilku przeciążeń metody Add obiektu ConstraintCollection , aby utworzyć element ForeignKeyConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a ForeignKeyConstraint.

Podczas tworzenia elementu element ForeignKeyConstraint można przekazać wartości DeleteRule i UpdateRule do konstruktora jako argumenty lub ustawić je jako właściwości, tak jak w poniższym przykładzie (gdzie wartość DeleteRule jest ustawiona na none).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

Zmiany w wierszach można zaakceptować przy użyciu metody AcceptChanges lub anulowane przy użyciu metody RejectChanges zestawu danych, DataTable lub DataRow.Changes to rows can be accepted using the AcceptChanges method or canceled using the RejectChanges method of the DataSet, DataTable, or DataRow. Gdy zestaw danych zawiera ForeignKeyConstraints, wywoływanie metod AcceptChanges lub RejectChanges wymusza AcceptRejectRule.When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. Właściwość AcceptRejectRule element ForeignKeyConstraint określa, która akcja zostanie podjęta w wierszach podrzędnych w przypadku wywołania metody AcceptChanges lub RejectChanges w wierszu nadrzędnym.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.

W poniższej tabeli wymieniono dostępne ustawienia dla AcceptRejectRule.The following table lists the available settings for the AcceptRejectRule.

Ustawienie regułyRule setting OpisDescription
CascadeCascade Akceptowanie lub odrzucanie zmian w wierszach podrzędnych.Accept or reject changes to child rows.
BrakNone Nie podejmuj żadnych działań w wierszach podrzędnych.Take no action on child rows. Jest to opcja domyślna.This is the default.

PrzykładExample

Poniższy przykład tworzy ForeignKeyConstraint , ustawia kilka jego właściwości, w tym AcceptRejectRule i dodaje go do ConstraintCollection DataTable obiektu.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

Obiekt UniqueConstraint , który można przypisać do pojedynczej kolumny lub do tablicy kolumn w tabeli DataTable, zapewnia, że wszystkie dane w określonej kolumnie lub kolumnach są unikatowe dla każdego wiersza.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. Można utworzyć unikatowe ograniczenie dla kolumny lub tablicy kolumn za pomocą konstruktora UniqueConstraint .You can create a unique constraint for a column or array of columns by using the UniqueConstraint constructor. Przekaż otrzymany obiekt UniqueConstraint do metody Add właściwości ograniczenia tabeli, która jest elementem ConstraintCollection.Pass the resulting UniqueConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. Można również przekazać argumenty konstruktora do kilku przeciążeń metody Add obiektu ConstraintCollection , aby utworzyć UniqueConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a UniqueConstraint. Podczas tworzenia UniqueConstraint dla kolumny lub kolumn można opcjonalnie określić, czy kolumna lub kolumny są kluczem podstawowym.When creating a UniqueConstraint for a column or columns, you can optionally specify whether the column or columns are a primary key.

Możesz również utworzyć unikatowe ograniczenie dla kolumny, ustawiając właściwość Unique kolumny na wartość true.You can also create a unique constraint for a column by setting the Unique property of the column to true. Alternatywnie, ustawienie właściwości Unique pojedynczej kolumny na false usuwa wszelkie unikatowe ograniczenia, które mogą istnieć.Alternatively, setting the Unique property of a single column to false removes any unique constraint that may exist. Definiowanie kolumny lub kolumn jako klucza podstawowego dla tabeli spowoduje automatyczne utworzenie unikatowego ograniczenia dla określonej kolumny lub kolumny.Defining a column or columns as the primary key for a table will automatically create a unique constraint for the specified column or columns. Jeśli usuniesz kolumnę z właściwości PrimaryKey elementu DataTable, UniqueConstraint zostanie usunięta.If you remove a column from the PrimaryKey property of a DataTable, the UniqueConstraint is removed.

Poniższy przykład tworzy UniqueConstraint dla dwóch kolumn tabeli 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);  

Zobacz teżSee also