Dela via


DataTable-begränsningar

Du kan använda begränsningar för att framtvinga begränsningar för data i en DataTable, för att upprätthålla dataintegriteten. En begränsning är en automatisk regel, som tillämpas på en kolumn eller relaterade kolumner, som avgör hur åtgärden fungerar när värdet för en rad på något sätt ändras. Begränsningar tillämpas när System.Data.DataSet.EnforceConstraints egenskapen för DataSet är sann. Ett kodexempel som visar hur du EnforceConstraints anger egenskapen finns i referensavsnittet EnforceConstraints .

Det finns två typer av begränsningar i ADO.NET: ForeignKeyConstraint och UniqueConstraint. Som standard skapas båda begränsningarna automatiskt när du skapar en relation mellan två eller flera tabeller genom att lägga till en DataRelation i DataSet. Du kan dock inaktivera det här beteendet genom att ange createConstraints = false när du skapar relationen.

ForeignKeyConstraint

En ForeignKeyConstraint tillämpar regler om hur uppdateringar och borttagningar till relaterade tabeller sprids. Om till exempel ett värde i en rad i en tabell uppdateras eller tas bort och samma värde också används i en eller flera relaterade tabeller, avgör en ForeignKeyConstraint vad som händer i de relaterade tabellerna.

Egenskaperna DeleteRule och UpdateRule för ForeignKeyConstraint definierar den åtgärd som ska vidtas när användaren försöker ta bort eller uppdatera en rad i en relaterad tabell. I följande tabell beskrivs de olika inställningar som är tillgängliga för egenskaperna DeleteRule och UpdateRule för ForeignKeyConstraint.

Regelinställning beskrivning
Cascade Ta bort eller uppdatera relaterade rader.
SetNull Ange värden i relaterade rader till DBNull.
SetDefault Ange värden i relaterade rader till standardvärdet.
None Vidta inga åtgärder på relaterade rader. Det här är standardinställningen.

En ForeignKeyConstraint kan begränsa, samt sprida, ändringar till relaterade kolumner. Om egenskapen EnforceConstraints för DataSet är true, resulterar det i ett undantag om egenskapen EnforceConstraints för datauppsättningen är true. Om egenskapen DeleteRule för ForeignKeyConstraint till exempel är None kan en överordnad rad inte tas bort om den har några underordnade rader.

Du kan skapa en sekundärnyckelbegränsning mellan enskilda kolumner eller mellan en matris med kolumner med hjälp av konstruktorn ForeignKeyConstraint . Skicka det resulterande Objektet ForeignKeyConstraint till metoden Lägg till i tabellens egenskap Constraints, som är en ConstraintCollection. Du kan också skicka konstruktorargument till flera överlagringar av metoden Lägg till i en ConstraintCollection för att skapa en ForeignKeyConstraint.

När du skapar en ForeignKeyConstraint kan du skicka värdena DeleteRule och UpdateRule till konstruktorn som argument, eller så kan du ange dem som egenskaper som i följande exempel (där Värdet DeleteRule är inställt på Ingen).

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

Ändringar i rader kan accepteras med metoden AcceptChanges eller avbrytas med metoden RejectChanges i DataSet, DataTable eller DataRow. När en DataSet innehåller ForeignKeyConstraints tillämpas AcceptRejectRule genom att anropa metoderna AcceptChanges eller RejectChanges. Egenskapen AcceptRejectRule för ForeignKeyConstraint avgör vilken åtgärd som ska vidtas på de underordnade raderna när AcceptChanges eller RejectChanges anropas på den överordnade raden.

I följande tabell visas de tillgängliga inställningarna för AcceptRejectRule.

Regelinställning beskrivning
Cascade Acceptera eller avvisa ändringar i underordnade rader.
None Vidta inga åtgärder på underordnade rader. Det här är standardinställningen.

Exempel

I följande exempel skapas en ForeignKeyConstraint, anger flera av dess egenskaper, inklusive AcceptRejectRule, och lägger till den i ConstraintCollection ett DataTable objekt.

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

Objektet UniqueConstraint, som kan tilldelas antingen till en enskild kolumn eller till en matris med kolumner i en DataTable, säkerställer att alla data i den angivna kolumnen eller kolumnerna är unika per rad. Du kan skapa en unik begränsning för en kolumn eller matris med kolumner med hjälp av konstruktorn UniqueConstraint . Skicka det resulterande Objektet UniqueConstraint till metoden Lägg till i tabellens egenskap Constraints, som är en ConstraintCollection. Du kan också skicka konstruktorargument till flera överlagringar av metoden Lägg till i en ConstraintCollection för att skapa en UniqueConstraint. När du skapar en UniqueConstraint för en kolumn eller kolumner kan du ange om kolumnen eller kolumnerna är en primärnyckel.

Du kan också skapa en unik begränsning för en kolumn genom att ange kolumnens unika egenskap till true. Om du anger egenskapen Unik för en enskild kolumn till false kan du också ta bort alla unika begränsningar som kan finnas. Om du definierar en kolumn eller kolumner som primärnyckel för en tabell skapas automatiskt en unik begränsning för den angivna kolumnen eller kolumnerna. Om du tar bort en kolumn från egenskapen PrimaryKey för en DataTable tas UniqueConstraint bort.

I följande exempel skapas en UniqueConstraint för två kolumner i en 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);  

Se även