Share via


Hinzufügen von Einschränkungen zu einer Tabelle

Mit Hilfe von Einschränkungen können Sie die in einer DataTable enthaltenen Daten beschränken, um die Datenintegrität zu erhalten. Eine Einschränkung ist eine automatische Regel, die auf eine Spalte oder zugehörige Spalten angewendet wird und die die Vorgehensweise bestimmt, wenn der Wert einer Spalte auf irgendeine Weise verändert wird. Einschränkungen werden durchgesetzt, wenn die EnforceConstraints-Eigenschaft des DataSets den Wert true hat.

In ADO.NET gibt es zwei Arten von Einschränkungen: die Fremdschlüsseleinschränkung (ForeignKeyConstraint) und die eindeutige Einschränkung (UniqueConstraint). Beide Einschränkungen werden standardmäßig automatisch erstellt, wenn Sie eine Beziehung zwischen zwei oder mehreren Tabellen herstellen, indem Sie dem DataSet eine DataRelation hinzufügen. Dieses Verhalten kann jedoch auch unterbunden werden, indem beim Erstellen der Beziehung createConstraints = false festgelegt wird.

"ForeignKeyConstraint"

Mit den durch eine ForeignKeyConstraint festgelegten Regeln wird bestimmt, wie Aktualisierungen und Löschvorgänge an zugehörige Tabellen weitergegeben werden. Beispiel: Wenn ein Wert in einer Zeile einer Tabelle aktualisiert oder gelöscht wird und dieser Wert auch in einer oder mehreren zugehörigen Tabellen verwendet wird, bestimmt eine ForeignKeyConstraint, was in den zugehörigen Tabellen geschieht.

Mit Hilfe der Eigenschaften DeleteRule und UpdateRule der ForeignKeyConstraint werden die Aktionen definiert, die beim Versuch des Benutzers, eine Zeile in einer zugehörigen Tabelle zu löschen oder zu aktualisieren, ausgeführt werden. In der folgenden Tabelle sind die verschiedenen Einstellungen beschrieben, die für die Eigenschaften DeleteRule und UpdateRule der ForeignKeyConstraint verfügbar sind.

Regel Beschreibung
Cascade Zugehörige Zeilen werden gelöscht oder aktualisiert. Dies ist die Standardeinstellung.
SetNull Die Werte in zugehörigen Zeilen werden auf DBNull gesetzt.
SetDefault Die Werte in zugehörigen Zeilen werden auf den Standardwert gesetzt.
None In den zugehörigen Zeilen wird keine Aktion ausgeführt.

Eine ForeignKeyConstraint kann Änderungen an zusammengehörigen Spalten sowohl einschränken als auch weitergeben. Je nachdem, welche Eigenschaften für die ForeignKeyConstraint einer Spalte gesetzt sind, und ob die EnforceConstraints-Eigenschaft des DataSet true ist, löst die Ausführung von bestimmten Operationen in der übergeordneten Zeile eine Ausnahme aus. Beispiel: Wenn die DeleteRule-Eigenschaft der ForeignKeyConstraint auf None gesetzt ist, kann eine übergeordnete Zeile nicht gelöscht werden, wenn sie untergeordnete Zeilen enthält.

Sie können eine Fremdschlüsseleinschränkung zwischen einzelnen Spalten oder in einem Spaltenarray erstellen, indem Sie den ForeignKeyConstraint-Konstruktor verwenden. Übergeben Sie das resultierende ForeignKeyConstraint-Objekt an die Add-Methode der Constraints-Eigenschaft der Tabelle. Diese ist eine ConstraintCollection. Sie können auch Konstruktorargumente an mehrere Überladungen der Add-Methode einer ConstraintCollection übergeben, um eine ForeignKeyConstraint zu erstellen.

Beim Erstellen einer ForeignKeyConstraint können Sie den DeleteRule-Wert und den UpdateRule-Wert als Argumente an den Konstruktor übergeben oder als Eigenschaften festlegen, wie im folgenden Beispiel gezeigt (bei dem für UpdateRule der Standardwert Cascade festgelegt wird).

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)
[C#]
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 mit Hilfe der AcceptChanges-Methode übernommen oder mit der RejectChanges-Methode des DataSets, der DataTable oder der DataRow abgebrochen werden. Wenn ein DataSet ForeignKeyConstraints enthält, wird durch Aufrufen der AcceptChanges- oder der RejectChanges-Methode die AcceptRejectRule angewendet. Die AcceptRejectRule-Eigenschaft der ForeignKeyConstraint bestimmt, welche Aktion in den untergeordneten Zeilen ausgeführt wird, wenn in der übergeordneten Zeile AcceptChanges oder RejectChanges aufgerufen wird.

Die folgende Tabelle zeigt die Werte, auf die die AcceptRejectRule gesetzt werden kann.

Aktion Beschreibung
Cascade Änderungen in untergeordneten Zeilen werden akzeptiert oder zurückgewiesen.
None In den untergeordneten Zeilen wird keine Aktion ausgeführt. Dies ist die Standardeinstellung.

"UniqueConstraint"

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

Sie können auch eine unique-Einschränkung für eine Spalte erstellen, indem Sie die Unique-Eigenschaft der Spalte auf true setzen. Alternativ werden alle möglicherweise vorhandenen unique-Einschränkungen entfernt, wenn die Unique-Eigenschaft einer einzelnen Spalte auf false gesetzt wird. Durch das Definieren einer oder mehrerer Spalten als Primärschlüssel für eine Tabelle wird automatisch eine unique-Einschränkung für die angegebene(n) Spalte(n) erstellt. Wenn Sie eine Spalte aus der PrimaryKey-Eigenschaft einer DataTable entfernen, wird die UniqueConstraint entfernt.

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

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

Siehe auch

Erstellen und Verwenden von DataSets | DataRelation-Klasse | DataTable-Klasse | ForeignKeyConstraint-Klasse | UniqueConstraint-Klasse