DataTable-EinschränkungenDataTable Constraints

Mithilfe von Einschränkungen können Sie die in einer DataTable enthaltenen Daten einschränken, um die Datenintegrität zu erhalten.You can use constraints to enforce restrictions on the data in a DataTable, in order to maintain the integrity of the data. Eine Einschränkung ist eine automatische Regel, die auf eine Spalte oder zugehörige Spalten angewendet wird und die die Vorgehensweise beim Ändern des Werts einer Spalte festlegt.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. Einschränkungen werden erzwungen, wenn System.Data.DataSet.EnforceConstraints die-Eigenschaft DataSet von den Wert truehat.Constraints are enforced when the System.Data.DataSet.EnforceConstraints property of the DataSet is true. Ein Codebeispiel, in dem das Festlegen der EnforceConstraints-Eigenschaft veranschaulicht wird, finden Sie im EnforceConstraints-Referenzthema.For a code example that shows how to set the EnforceConstraints property, see the EnforceConstraints reference topic.

Es gibt zwei Arten von Einschränkungen in ADO.NET: die ForeignKeyConstraint und die UniqueConstraint.There are two kinds of constraints in ADO.NET: the ForeignKeyConstraint and the UniqueConstraint. Standardmäßig werden beide Einschränkungen automatisch erstellt, wenn Sie eine Beziehung zwischen zwei oder mehr Tabellen erstellen, indem Sie DataRelation dem DataSeteine hinzufügen.By default, both constraints are created automatically when you create a relationship between two or more tables by adding a DataRelation to the DataSet. Sie können dieses Verhalten jedoch deaktivieren, indemSie beim Erstellen der Beziehung die Angabe = von "beim Erstellen von" "" "beim Erstellen von"However, you can disable this behavior by specifying createConstraints = false when creating the relation.

ForeignKeyConstraintForeignKeyConstraint

Eine fremd Schlüssel Einschränkung erzwingt Regeln für die Weitergabe von Updates und Löschungen in verknüpften Tabellen.A ForeignKeyConstraint enforces rules about how updates and deletes to related tables are propagated. Wenn z. b. ein Wert in einer Zeile einer Tabelle aktualisiert oder gelöscht wird und derselbe Wert auch in einer oder mehreren verknüpften Tabellen verwendet wird, bestimmt eine fremd Schlüssel Einschränkung , was in den verknüpften Tabellen passiert.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.

Die DeleteRule - UpdateRule Eigenschaft und die-Eigenschaft der fremd Schlüssel Einschränkung definieren die Aktion, die durchgeführt werden soll, wenn der Benutzer versucht, eine Zeile in einer verknüpften Tabelle zu löschen oder zu aktualisieren.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. In der folgenden Tabelle werden die verschiedenen Einstellungen beschrieben, die für die DeleteRule -Eigenschaft und die UpdateRule -Eigenschaft der fremd Schlüssel Einschränkungverfügbar sind.The following table describes the different settings available for the DeleteRule and UpdateRule properties of the ForeignKeyConstraint.

Festgelegte RegelRule setting BeschreibungDescription
CascadeCascade Verknüpfte Zeilen werden gelöscht oder aktualisiert.Delete or update related rows.
SetNullSetNull Legen Sie Werte in verknüpften Zeilen auf DBNullfest.Set values in related rows to DBNull.
SetDefaultSetDefault Für die Werte in verknüpften Zeilen wird der Standardwert festgelegt.Set values in related rows to the default value.
KeineNone In verknüpften Zeilen wird keine Aktion ausgeführt.Take no action on related rows. Dies ist die Standardeinstellung.This is the default.

Eine fremd Schlüssel Einschränkung kann die Änderungen an verknüpften Spalten einschränken und übertragen.A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. Abhängig von den Eigenschaften, die für die fremd Schlüssel Einschränkung einer Spalte festgelegt sind, führt die Ausführung bestimmter Vorgänge in der übergeordneten Zeile zu einer Ausnahme, wenn die EnforceConstraints -Eigenschaft des DataSets auf truefestgelegt ist.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. Wenn z. b. die DeleteRule -Eigenschaft der fremd Schlüssel Einschränkung Noneist, kann eine übergeordnete Zeile nicht gelöscht werden, wenn Sie über untergeordnete Zeilen verfügt.For example, if the DeleteRule property of the ForeignKeyConstraint is None, a parent row cannot be deleted if it has any child rows.

Sie können eine FOREIGN KEY-Einschränkung zwischen einzelnen Spalten oder zwischen einem Spalten Array erstellen, indem Sie den Foreign nkeyeinschränkung -Konstruktor verwenden.You can create a foreign key constraint between single columns or between an array of columns by using the ForeignKeyConstraint constructor. Übergeben Sie das resultierende fremdkeyeinschränkungs -Objekt an die Add -Methode der Einschränkungs Eigenschaft der Tabelle, bei der es sich um eine EinschränkungsAuflistung handelt.Pass the resulting ForeignKeyConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. Sie können auch Konstruktorargumente an mehrere über Ladungen der Add -Methode einer Einschränkungs Auflistung übergeben, um eine fremd Schlüssel Einschränkungzu erstellen.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a ForeignKeyConstraint.

Wenn Sie eine fremd Schlüssel Einschränkungerstellen, können Sie die Werte DeleteRule und UpdateRule als Argumente an den Konstruktor übergeben, oder Sie können Sie als Eigenschaften festlegen, wie im folgenden Beispiel dargestellt (wobei der DeleteRule -Wert auf festgelegt ist. Keine).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

Änderungen an Zeilen können mithilfe der akzeptchanges -Methode akzeptiert oder mit der RejectChanges -Methode des DataSets, Datableoder DataRowabgebrochen werden.Changes to rows can be accepted using the AcceptChanges method or canceled using the RejectChanges method of the DataSet, DataTable, or DataRow. Wenn ein DataSet fremd Schlüssel Einschränkungenenthält, erzwingt das Aufrufen der Methoden " akzeptchanges " oder " RejectChanges " das " akzeptrejectrule".When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. Die Eigenschaft " Accept trejectrule " der fremd Schlüssel Einschränkung bestimmt, welche Aktion für die untergeordneten Zeilen ausgeführt wird, wenn " Accept Changes " oder " RejectChanges " in der übergeordneten Zeile aufgerufen wird.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.

In der folgenden Tabelle sind die verfügbaren Einstellungen für " akzeptrejectrule" aufgeführt.The following table lists the available settings for the AcceptRejectRule.

Festgelegte RegelRule setting BeschreibungDescription
CascadeCascade Änderungen in untergeordneten Zeilen werden akzeptiert oder zurückgewiesen.Accept or reject changes to child rows.
KeineNone In den untergeordneten Zeilen wird keine Aktion ausgeführt.Take no action on child rows. Dies ist die Standardeinstellung.This is the default.

BeispielExample

Im folgenden Beispiel wird ein ForeignKeyConstraint-Objekt erstellt, und es werden einige seiner Eigenschaften festgelegt (einschließlich der AcceptRejectRule-Regel) und dem ConstraintCollection-Objekt eines DataTable-Objekts hinzugefügt.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

Das UniqueConstraint -Objekt, das entweder einer einzelnen Spalte oder einem Array von Spalten in einer DatenTabelle zugewiesen werden kann, stellt sicher, dass alle Daten in den angegebenen Spalten pro Zeile eindeutig sind.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. Sie können eine Unique-Einschränkung für eine Spalte oder ein Array von Spalten erstellen, indem Sie den UniqueConstraint -Konstruktor verwenden.You can create a unique constraint for a column or array of columns by using the UniqueConstraint constructor. Übergeben Sie das sich ergebende UniqueConstraint -Objekt an die Add -Methode der Einschränkungs Eigenschaft der Tabelle, bei der es sich um eine EinschränkungsAuflistung handelt.Pass the resulting UniqueConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. Sie können auch Konstruktorargumente an mehrere über Ladungen der Add -Methode einer Einschränkungs Auflistung übergeben, um UniqueConstraintzu erstellen.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a UniqueConstraint. Beim Erstellen eines UniqueConstraint für eine Spalte oder Spalten können Sie optional angeben, ob es sich bei der Spalte oder den Spalten um einen Primärschlüssel handelt.When creating a UniqueConstraint for a column or columns, you can optionally specify whether the column or columns are a primary key.

Sie können auch eine Unique-Einschränkung für eine Spalte erstellen, indem Sie die Unique -Eigenschaft der Spalte auf truefestlegen.You can also create a unique constraint for a column by setting the Unique property of the column to true. Wenn Sie die Unique -Eigenschaft einer einzelnen Spalte auf false festlegen, werden alle ggf. vorhandenen eindeutigen Einschränkungen entfernt.Alternatively, setting the Unique property of a single column to false removes any unique constraint that may exist. Durch das Definieren einer oder mehrerer Spalten als Primärschlüssel für eine Tabelle wird automatisch eine eindeutige Einschränkung für die angegebene(n) Spalte(n) erstellt.Defining a column or columns as the primary key for a table will automatically create a unique constraint for the specified column or columns. Wenn Sie eine Spalte aus der PrimaryKey -Eigenschaft einer DatenTabelle entfernen, wird UniqueConstraint entfernt.If you remove a column from the PrimaryKey property of a DataTable, the UniqueConstraint is removed.

Im folgenden Beispiel wird eine UniqueConstraint für zwei Spalten einer DatenTabelle erstellt.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);  

Siehe auchSee also