Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 angeben createConstraints = false .
ForeignKeyConstraint
Eine ForeignKeyConstraint erzwingt, wie Regeln bei Aktualisierungen und Löschungen auf verwandte Tabellen angewendet werden. Wenn beispielsweise ein Wert in einer Zeile einer Tabelle aktualisiert oder gelöscht wird und dieser Wert auch in einer oder mehreren verknüpften Tabellen verwendet wird, bestimmt eine ForeignKeyConstraint , was in den zugehörigen Tabellen geschieht.
Die Eigenschaften DeleteRule und UpdateRule der ForeignKeyConstraint definieren die Aktion, die ausgeführt werden soll, 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 DeleteRule und UpdateRule Eigenschaften des 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. |
Eine ForeignKeyConstraint kann Änderungen an verwandten Spalten einschränken und weitergeben. Abhängig von den eigenschaften, die für die ForeignKeyConstraint Spalte festgelegt sind, führt die Ausführung bestimmter Vorgänge für die übergeordnete Zeile zu einer Ausnahme, wenn die EnforceConstraints Eigenschaft DataSet der Spalte "true" ist. Wenn beispielsweise die DeleteRule Eigenschaft "ForeignKeyConstraintNone" lautet, 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 zwischen einem Array von Spalten mithilfe des ForeignKeyConstraint Konstruktors erstellen. Übergeben Sie das resultierende ForeignKeyConstraint Objekt an die Add Methode der Tabelleneigenschaft Constraints , bei der es sich um eine ConstraintCollection handelt. Sie können auch Konstruktorargumente an mehrere Überladungen der Add-Methode eines ConstraintCollection übergeben, um ein ForeignKeyConstraint zu erstellen.
Beim Erstellen eines ForeignKeyConstraint-Objekts können Sie die DeleteRule Werte als UpdateRule Argumente an den Konstruktor übergeben oder 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 von DataSet, DataTable oder DataRow abgebrochen werden. Wenn ein DataSetForeignKeyConstraints enthält, erzwingt das Aufrufen der AcceptChanges- oder RejectChanges-Methode die AcceptRejectRule. Die AcceptRejectRule Eigenschaft der ForeignKeyConstraint bestimmt, welche Aktion für die untergeordneten Zeilen ausgeführt wird, wenn AcceptChanges oder RejectChanges für die übergeordnete Zeile 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 Spalte pro Zeile eindeutig sind. Mithilfe des UniqueConstraint Konstruktors können Sie eine eindeutige Einschränkung für eine Spalte oder ein Array von Spalten erstellen. Übergeben Sie das resultierende UniqueConstraint Objekt an die Add Methode der Tabelleneigenschaft Constraints , bei der es sich um eine ConstraintCollection handelt. Sie können Konstruktorargumente auch an mehrere Überladungen der Add Methode eines ConstraintCollection Objekts übergeben, um einen UniqueConstraint zu erstellen. Beim Erstellen einer UniqueConstraint Spalte oder Spalten können Sie optional angeben, ob es sich bei der Spalte oder den Spalten um einen Primärschlüssel handelt.
Sie können auch eine eindeutige Einschränkung für eine Spalte erstellen, indem Sie die Unique Eigenschaft der Spalte auf "true" festlegen. Durch das Festlegen der Unique-Eigenschaft einer einzelnen Spalte auf false kann jede eindeutige Einschränkung entfernt werden, die möglicherweise vorhanden ist. 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 die UniqueConstraint Spalte entfernt.
Im folgenden Beispiel wird eine 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);