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í: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 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.

UpdateRuleVlastnosti 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);  

Viz také