Freigeben über


DataTable-Einschränkungen

Sie können Beschränkungen verwenden, um Einschränkungen für die Daten in einer DataTable zu erzwingen, damit die Integrität der Daten gewahrt bleibt. Eine Einschränkung ist eine automatische Regel, die auf eine Spalte oder verwandte Spalten angewendet wird, die den Aktionsverlauf bestimmt, wenn der Wert einer Zeile irgendwie geändert wird. Einschränkungen werden erzwungen, wenn die System.Data.DataSet.EnforceConstraints-Eigenschaft von DataSet auf true festgelegt wird. Ein Codebeispiel, das zeigt, wie die EnforceConstraints Eigenschaft festgelegt wird, finden Sie im EnforceConstraints Referenzthema.

Es gibt zwei Arten von Einschränkungen in ADO.NET: die ForeignKeyConstraint und die UniqueConstraint. Standardmäßig werden beide Einschränkungen automatisch erstellt, wenn Sie eine Beziehung zwischen zwei oder mehr Tabellen erstellen, indem Sie dem DataRelation einen hinzufügen. Sie können dieses Verhalten jedoch deaktivieren, indem Sie beim Erstellen der Beziehung "createConstraints = false " angeben.

ForeignKeyConstraint

Ein ForeignKeyConstraint erzwingt Regeln darüber, wie Aktualisierungen und Löschungen an verwandte Tabellen weitergegeben werden. Wenn beispielsweise 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 ein ForeignKeyConstraint , was in den verknüpften Tabellen geschieht.

Die Eigenschaften DeleteRule und UpdateRule des ForeignKeyConstraint definieren die auszuführende Aktion, wenn der Benutzer versucht, eine Zeile in einer verknüpften Tabelle zu löschen oder zu aktualisieren. In der folgenden Tabelle werden die verschiedenen Einstellungen beschrieben, die für die Eigenschaften DeleteRule und UpdateRule der ForeignKeyConstraint verfügbar sind.

Regelsetzung BESCHREIBUNG
Kaskade Löschen oder Aktualisieren verwandter Zeilen.
SetNull Für die Werte in verknüpften Zeilen wird DBNull festgelegt.
SetDefault Legen Sie Werte in verknüpften Zeilen auf den Standardwert fest.
Nichts In verknüpften Zeilen wird keine Aktion ausgeführt. Dies ist die Standardeinstellung.

Ein ForeignKeyConstraint kann Änderungen an verwandten Spalten einschränken und weitergeben. Je nachdem, welche Eigenschaften für die ForeignKeyConstraint-Eigenschaft einer Spalte festgelegt wurden, führt das Ausführen bestimmter Vorgänge für die übergeordnete Zeile zu einer Ausnahme, wenn die EnforceConstraints-Eigenschaft des DataSettrue ist. Wenn die DeleteRule-Eigenschaft der ForeignKeyConstraint beispielsweise "None" lautet, kann eine übergeordnete Zeile nicht gelöscht werden, wenn sie über untergeordnete Zeilen verfügt.

Sie können eine Fremdschlüsseleinschränkung zwischen einzelnen Spalten oder zwischen einem Array von Spalten mithilfe des ForeignKeyConstraint-Konstruktors erstellen. Übergeben Sie das resultierende ForeignKeyConstraint-Objekt an die Add-Methode der Constraints-Eigenschaft der Tabelle, bei der es sich um eine ConstraintCollection handelt. Sie können Konstruktorargumente auch an mehrere Überladungen der Add-Methode einer ConstraintCollection übergeben, um einen ForeignKeyConstraint zu erstellen.

Beim Erstellen eines ForeignKeyConstraint-Objekts können Sie die DeleteRule - und UpdateRule-Werte als Argumente an den Konstruktor übergeben, oder Sie können diese als Eigenschaften wie im folgenden Beispiel festlegen (wobei der DeleteRule-Wert auf "None" festgelegt ist).

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

Änderungen an Zeilen können mithilfe der AcceptChanges-Methode akzeptiert oder mithilfe der RejectChanges-Methode des DataSet, DataTable oder DataRow abgebrochen werden. Wenn ein DataSetForeignKeyConstraints enthält, erzwingt das Aufrufen der Methoden AcceptChanges oder RejectChanges die AcceptRejectRule. Die AcceptRejectRule-Eigenschaft von ForeignKeyConstraint bestimmt, welche Aktion in den untergeordneten Zeilen ausgeführt wird, wenn in der übergeordneten Zeile AcceptChanges oder RejectChanges aufgerufen wird.

In der folgenden Tabelle sind die verfügbaren Einstellungen für " AcceptRejectRule" aufgeführt.

Regelsetzung BESCHREIBUNG
Kaskade Änderungen in untergeordneten Zeilen werden akzeptiert oder zurückgewiesen.
Nichts In den untergeordneten Zeilen wird keine Aktion ausgeführt. Dies ist die Standardeinstellung.

Beispiel

Im folgenden Beispiel wird ein ForeignKeyConstraint erstellt, mehrere Eigenschaften, einschließlich des AcceptRejectRule, werden festgelegt und es wird dem ConstraintCollection eines DataTable Objekts hinzugefügt.

static void CreateConstraint(DataSet dataSet,
    string table1, string table2, string column1, string column2)
{
    // Declare parent column and child column variables.
    DataColumn parentColumn, childColumn;
    ForeignKeyConstraint foreignKeyConstraint;

    // Set parent and child column variables.
    parentColumn = dataSet.Tables[table1]?.Columns[column1] ??
        throw new NullReferenceException($"{nameof(CreateConstraint)}: {table1}.{column1} not found");
    childColumn = dataSet.Tables[table2]?.Columns[column2] ??
        throw new NullReferenceException($"{nameof(CreateConstraint)}: {table2}.{column2} not found");
    foreignKeyConstraint = new ForeignKeyConstraint
       ("SupplierForeignKeyConstraint", parentColumn, childColumn)
    {
        // Set null values when a value is deleted.
        DeleteRule = Rule.SetNull,
        UpdateRule = Rule.Cascade,
        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

UniqueConstraint

Das UniqueConstraint -Objekt, das entweder einer einzelnen Spalte oder einem Array von Spalten in einer DataTable zugewiesen werden kann, stellt sicher, dass alle Daten in der angegebenen Spalte oder Spalten pro Zeile eindeutig sind. Sie können eine eindeutige Einschränkung für eine Spalte oder ein Array von Spalten erstellen, indem Sie den UniqueConstraint-Konstruktor verwenden. Übergeben Sie das resultierende UniqueConstraint-Objekt an die Add-Methode der Constraints-Eigenschaft der Tabelle, bei der es sich um eine ConstraintCollection handelt. Sie können Konstruktorargumente auch an mehrere Überladungen der Add-Methode einer ConstraintCollection übergeben, um einen UniqueConstraint zu erstellen. Beim Erstellen eines UniqueConstraint für eine oder mehrere Spalten können Sie optional angeben, ob die Spalte oder die Spalten ein Primärschlüssel ist.

Sie können auch eine eindeutige Einschränkung für eine Spalte erstellen, indem Sie die Unique-Eigenschaft der Spalte auf "true" festlegen. Alternativ wird durch Festlegen der Unique-Eigenschaft einer einzelnen Spalte auf "false " jede eindeutige Einschränkung entfernt, die vorhanden sein kann. Wenn Sie eine Spalte oder Spalten als Primärschlüssel für eine Tabelle definieren, wird automatisch eine eindeutige Einschränkung für die angegebene Spalte oder Spalte erstellt. Wenn Sie eine Spalte aus der PrimaryKey-Eigenschaft einer DataTable entfernen, wird der UniqueConstraint entfernt.

Im folgenden Beispiel wird ein UniqueConstraint für zwei Spalten einer DataTable erstellt.

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 auch