Delen via


Beperkingen voor gegevenstabel

U kunt beperkingen gebruiken om beperkingen af te dwingen voor de gegevens in een DataTable, om de integriteit van de gegevens te behouden. Een beperking is een automatische regel die wordt toegepast op een kolom of gerelateerde kolommen, die de werking bepaalt wanneer de waarde van een rij op een of andere manier wordt gewijzigd. Beperkingen worden afgedwongen wanneer de eigenschap van de System.Data.DataSet.EnforceConstraintsDataSet eigenschap waar is. Zie het EnforceConstraints naslagonderwerp voor een codevoorbeeld waarin wordt getoond hoe u de EnforceConstraints eigenschap instelt.

Er zijn twee soorten beperkingen in ADO.NET: de ForeignKeyConstraint en de UniqueConstraint. Standaard worden beide beperkingen automatisch gemaakt wanneer u een relatie tussen twee of meer tabellen maakt door een DataRelation aan de DataSet toe te voegen. U kunt dit gedrag echter uitschakelen door createConstraints = false op te geven bij het maken van de relatie.

ForeignKeyConstraint

Een ForeignKeyConstraint dwingt regels af over hoe updates en verwijderingen naar gerelateerde tabellen worden doorgegeven. Als een waarde in een rij van één tabel bijvoorbeeld wordt bijgewerkt of verwijderd en dezelfde waarde ook wordt gebruikt in een of meer gerelateerde tabellen, bepaalt een ForeignKeyConstraint wat er gebeurt in de gerelateerde tabellen.

De DeleteRule en UpdateRule eigenschappen van ForeignKeyConstraint definiëren de actie die moet worden uitgevoerd wanneer de gebruiker probeert een rij in een gerelateerde tabel te verwijderen of bij te werken. In de volgende tabel worden de verschillende instellingen beschreven die beschikbaar zijn voor de eigenschappen DeleteRule en UpdateRule van de ForeignKeyConstraint.

Regelinstelling Beschrijving
Trapsgewijze Gerelateerde rijen verwijderen of bijwerken.
SetNull Stel waarden in gerelateerde rijen in op DBNull.
SetDefault Stel waarden in gerelateerde rijen in op de standaardwaarde.
Geen Geen actie ondernemen voor gerelateerde rijen. Dit is de standaardinstelling.

Een ForeignKeyConstraint kan wijzigingen in gerelateerde kolommen beperken en doorgeven. Afhankelijk van de eigenschappen die zijn ingesteld voor de ForeignKeyConstraint van een kolom, leidt het uitvoeren van bepaalde bewerkingen op de bovenliggende rij tot een uitzondering als de eigenschap EnforceConstraint van de DataSet waar is. Als de eigenschap DeleteRule van de ForeignKeyConstraint bijvoorbeeld Geen is, kan een bovenliggende rij niet worden verwijderd als deze onderliggende rijen bevat.

U kunt een refererende-sleutelbeperking maken tussen enkele kolommen of tussen een matrix met kolommen met behulp van de constructor ForeignKeyConstraint . Geef het resulterende ForeignKeyConstraint-object door aan de methode Add van de eigenschap Constraints van de tabel. Dit is een ConstraintCollection. U kunt ook constructorargumenten doorgeven aan verschillende overbelastingen van de methode Add van een ConstraintCollection om een ForeignKeyConstraint te maken.

Wanneer u een ForeignKeyConstraint maakt, kunt u de waarden DeleteRule en UpdateRule als argumenten doorgeven aan de constructor, of u kunt deze instellen als eigenschappen zoals in het volgende voorbeeld (waarbij de waarde DeleteRule is ingesteld op 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

Wijzigingen in rijen kunnen worden geaccepteerd met de methode AcceptChanges of geannuleerd met de methode RejectChanges van de DataSet, DataTable of DataRow. Wanneer een DataSet ForeignKeyConstraints bevat, dwingt u de methoden AcceptChanges of RejectChanges af om acceptRejectRule af te dwingen. De eigenschap AcceptRejectRule van de ForeignKeyConstraint bepaalt welke actie wordt uitgevoerd op de onderliggende rijen wanneer AcceptChanges of RejectChanges wordt aangeroepen op de bovenliggende rij.

De volgende tabel bevat de beschikbare instellingen voor de AcceptRejectRule.

Regelinstelling Beschrijving
Trapsgewijze Wijzigingen in onderliggende rijen accepteren of negeren.
Geen Geen actie ondernemen op onderliggende rijen. Dit is de standaardinstelling.

Opmerking

In het volgende voorbeeld wordt een ForeignKeyConstraint, een aantal eigenschappen ingesteld, inclusief de AcceptRejectRule, en wordt deze toegevoegd aan het ConstraintCollection object 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

Het Object UniqueConstraint , dat kan worden toegewezen aan één kolom of aan een matrix met kolommen in een gegevenstabel, zorgt ervoor dat alle gegevens in de opgegeven kolom of kolommen uniek zijn per rij. U kunt een unieke beperking maken voor een kolom of matrix met kolommen met behulp van de UniqueConstraint-constructor . Geef het resulterende UniqueConstraint-object door aan de methode Toevoegen van de eigenschap Beperkingen van de tabel, een ConstraintCollection. U kunt ook constructorargumenten doorgeven aan verschillende overbelastingen van de methode Add van een ConstraintCollection om een UniqueConstraint te maken. Wanneer u een UniqueConstraint maakt voor een kolom of kolommen, kunt u desgewenst opgeven of de kolom of kolommen een primaire sleutel zijn.

U kunt ook een unieke beperking voor een kolom maken door de eigenschap Uniek van de kolom in te stellen op waar. Als u de eigenschap Uniek van één kolom instelt op Onwaar , wordt elke unieke beperking verwijderd die mogelijk bestaat. Als u een kolom of kolommen definieert als primaire sleutel voor een tabel, wordt automatisch een unieke beperking gemaakt voor de opgegeven kolom of kolommen. Als u een kolom verwijdert uit de eigenschap PrimaryKey van een DataTable, wordt UniqueConstraintverwijderd.

In het volgende voorbeeld wordt een UniqueConstraint gemaakt voor twee kolommen van een gegevenstabel.

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

Zie ook