Omezení datových tabulek
Omezení můžete použít k vynucení omezení dat v rámci DataTable, aby se zachovala integrita dat. Omezení je automatické pravidlo použité u sloupce nebo souvisejících sloupců, které určuje průběh akce, když se hodnota řádku nějak změní. Omezení se vynucují, když System.Data.DataSet.EnforceConstraints
je vlastnost DataSet true. Příklad kódu, který ukazuje, jak nastavit EnforceConstraints
vlastnost, viz EnforceConstraints referenční téma.
V ADO.NET existují dva druhy omezení:ForeignKeyConstraint UniqueConstraint Ve výchozím nastavení se obě omezení vytvoří automaticky při vytváření relace mezi dvěma nebo více tabulkami přidáním DataRelation do datové sady. Toto chování však můžete zakázat zadáním hodnoty createConstraints = false při vytváření relace.
Foreignkeyconstraint
ForeignKeyConstraint vynucuje pravidla o tom, jak se šíří aktualizace a odstranění souvisejících tabulek. Pokud je například hodnota v řádku jedné tabulky aktualizována nebo odstraněna a tato stejná hodnota se používá také v jedné nebo více souvisejících tabulkách, CizíKeyConstraint určuje, co se stane v souvisejících tabulkách.
UpdateRule Vlastnosti DeleteRule ForeignKeyConstraint definují akci, která se má provést, když se uživatel pokusí odstranit nebo aktualizovat řádek v související tabulce. Následující tabulka popisuje různá nastavení dostupná pro vlastnosti DeleteRule a UpdateRule ForeignKeyConstraint.
Nastavení pravidla | Popis |
---|---|
Kaskády | Odstraňte nebo aktualizujte související řádky. |
SetNull | Nastavte hodnoty v souvisejících řádcích na DBNull. |
Nastavitdefault | Nastavte hodnoty v souvisejících řádcích na výchozí hodnotu. |
Nic | Na souvisejících řádcích nedochází k žádné akci. Tato možnost je výchozí. |
ForeignKeyConstraint může omezit změny souvisejících sloupců a také rozšířit. V závislosti na vlastnostech nastavené pro ForeignKeyConstraint sloupce, pokud EnforceConstraints vlastnost DataSet je true, provádění určitých operací na nadřazený řádek způsobí výjimku. Například pokud DeleteRule vlastnost ForeignKeyConstraint je None, nadřazený řádek nelze odstranit, pokud má žádné podřízené řádky.
Pomocí konstruktoru ForeignKeyConstraint můžete vytvořit omezení cizího klíče mezi jednotlivými sloupci nebo mezi polem sloupců. Předání výsledné ForeignKeyConstraint objektu Add metody table Constraints vlastnost, což je ConstraintCollection. Můžete také předat argumenty konstruktoru několika přetížení Add Metoda ConstraintCollection vytvořit ForeignKeyConstraint.
Při vytváření ForeignKeyConstraint můžete předat DeleteRule a UpdateRule hodnoty konstruktoru jako argumenty, nebo je můžete nastavit jako vlastnosti jako v následujícím příkladu (kde deleteRule hodnota je nastavena na 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);
AcceptRejectRule
Změny řádků lze přijmout pomocí AcceptChanges metoda nebo zrušit pomocí RejectChanges metoda DataSet, DataTable nebo DataRow. Pokud DataSet obsahuje ForeignKeyConstraints, vyvolání AcceptChanges nebo RejectChanges metody vynucuje AcceptRejectRule. AcceptRejectRule vlastnost ForeignKeyConstraint určuje, která akce bude provedena na podřízených řádcích, když AcceptChanges nebo RejectChanges je volána na nadřazený řádek.
Následující tabulka uvádí dostupná nastavení pro AcceptRejectRule.
Nastavení pravidla | Popis |
---|---|
Kaskády | Přijměte nebo odmítněte změny podřízených řádků. |
Nic | Na podřízených řádcích neprobídějte žádnou akci. Tato možnost je výchozí. |
Příklad
Následující příklad vytvoří ForeignKeyConstraint, nastaví několik jeho vlastností, včetně AcceptRejectRulea přidá jej do ConstraintCollection objektu DataTable .
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
UniqueConstraint objekt, který lze přiřadit buď k jednomu sloupci nebo k poli sloupců v tabulce DataTable, zajistí, že všechna data v zadaném sloupci nebo sloupcích jsou jedinečná pro každý řádek. Jedinečné omezení pro sloupec nebo pole sloupců můžete vytvořit pomocí konstruktoru UniqueConstraint . Předání výsledné UniqueConstraint objektu Add metody table Constraints vlastnost, což je ConstraintCollection. Můžete také předat argumenty konstruktoru několika přetížení Add Metody ConstraintCollection vytvořit UniqueConstraint. Při vytváření UniqueConstraint pro sloupec nebo sloupce můžete volitelně určit, jestli je sloupec nebo sloupce primárním klíčem.
Můžete také vytvořit jedinečné omezení pro sloupec nastavením jedinečné vlastnosti sloupce na hodnotu true. Případně nastavením vlastnosti Unique jednoho sloupce na hodnotu false odeberete jakékoli jedinečné omezení, které může existovat. Definování sloupce nebo sloupců jako primárního klíče tabulky automaticky vytvoří jedinečné omezení pro zadaný sloupec nebo sloupce. Pokud odeberete sloupec z PrimaryKey vlastnost DataTable, UniqueConstraint je odebrán.
Následující příklad vytvoří UniqueConstraint pro dva sloupce 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);