Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ž hodnota vlastnosti System.Data.DataSet.EnforceConstraints je DataSet. Příklad kódu, který ukazuje, jak nastavit EnforceConstraints vlastnost, viz EnforceConstraints referenční téma.
V ADO.NET existují dva druhy omezení:ForeignKeyConstraintUniqueConstraint 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 createConstraints = false při vytváření relace.
Omezení cizího klíče
A ForeignKeyConstraint vynucuje pravidla týkající se šíření aktualizací 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, určuje, ForeignKeyConstraint co se stane v souvisejících tabulkách.
Vlastnosti DeleteRule a UpdateRule vlastnosti 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í, která jsou k dispozici pro DeleteRule a vlastnosti UpdateRuleForeignKeyConstraint.
| Nastavení pravidla | Popis |
|---|---|
| Kaskádové | Odstraňte nebo aktualizujte související řádky. |
| SetNull | Nastavte hodnoty v souvisejících řádcích na DBNull. |
| Nastavit jako výchozí | Nastavte hodnoty v souvisejících řádcích na výchozí hodnotu. |
| Nic | Nevykonávejte žádnou akci na souvisejících řádcích. Toto je výchozí hodnota. |
A ForeignKeyConstraint může omezit i rozšířit změny souvisejících sloupců. V závislosti na vlastnostech nastavených pro ForeignKeyConstraint sloupec, pokud je vlastnost EnforceConstraintsDataSettrue, provedení určitých operací na nadřazeném řádku způsobí výjimku. Pokud je například DeleteRule vlastnost ForeignKeyConstraintNone, nelze nadřazený řádek odstranit, pokud má nějaké podřízené řádky.
Pomocí konstruktoru ForeignKeyConstraint můžete vytvořit omezení cizího klíče mezi jednotlivými sloupci nebo mezi polem sloupců. Předejte výsledný ForeignKeyConstraint objekt do Add metody vlastnosti tabulky Constraints, která je ConstraintCollection. Můžete také předat argumenty konstruktoru několika přetížením metody Add u ConstraintCollection k vytvoření ForeignKeyConstraint.
Při vytváření ForeignKeyConstraint můžete předat DeleteRule konstruktoru a UpdateRule hodnoty jako argumenty, nebo je můžete nastavit jako vlastnosti jako v následujícím příkladu (kde DeleteRule je hodnota 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);
Pravidlo Přijetí/Odmítnutí
Změny řádků lze přijmout pomocí AcceptChanges metody nebo zrušit pomocí RejectChanges metody DataSet, DataTable nebo DataRow. Pokud DataSet obsahuje ForeignKeyConstraints, vyvolání metod AcceptChanges nebo RejectChanges vynucuje pravidlo AcceptRejectRule. Vlastnost AcceptRejectRuleForeignKeyConstraint určuje, která akce bude provedena na podřízených řádcích, když jsou AcceptChanges nebo RejectChanges volány na nadřazený řádek.
Následující tabulka uvádí dostupná nastavení pro AcceptRejectRule.
| Nastavení pravidla | Popis |
|---|---|
| Kaskádové | Přijměte nebo odmítněte změny podřízených řádků. |
| Nic | Na podřízených řádcích neprovádějte žádnou akci. Toto je výchozí hodnota. |
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
Jedinečné omezení
Objekt UniqueConstraint , který lze přiřadit jednomu sloupci nebo poli sloupců v tabulce DataTable, zajistí, aby všechna data v zadaném sloupci nebo sloupcích byla jedinečná pro každý řádek. Pomocí konstruktoru UniqueConstraint můžete vytvořit jedinečné omezení pro sloupec nebo pole sloupců. Předejte výsledný UniqueConstraint objekt metodě Add vlastnosti Constraints tabulky, což je ConstraintCollection. Můžete také předat argumenty konstruktoru několika přetížením metody Add objektu ConstraintCollection k vytvoření UniqueConstraint. Při vytváření UniqueConstraint sloupce nebo sloupců 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 Unique vlastnosti sloupce na true. Případně může nastavení vlastnosti Unique u jednoho sloupce na false odebrat 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 vlastnosti DataTable, bude UniqueConstraint také odstraněn.
Následující příklad vytvoří UniqueConstraint pro dva sloupce tabulky 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);