Megosztás a következőn keresztül:


DataTable-korlátozások

Az adatok integritásának fenntartása érdekében kényszerekkel kényszerítheti az adatokra DataTablevonatkozó korlátozásokat. A kényszer egy oszlopra vagy kapcsolódó oszlopokra alkalmazott automatikus szabály, amely meghatározza a művelet menetét, amikor egy sor értékét valamilyen módon módosítják. A kényszerek akkor lesznek érvényesítve, ha a System.Data.DataSet.EnforceConstraintsDataSettulajdonság értéke igaz. A tulajdonság beállítását EnforceConstraints bemutató példakódért tekintse meg a referenciatémakört EnforceConstraints .

A ADO.NET kétféle kényszer létezik: az ForeignKeyConstraint és a UniqueConstraint. Alapértelmezés szerint mindkét korlátozás automatikusan létrejön, amikor két vagy több tábla közötti kapcsolatot hoz létre az Adathalmazhoz való hozzáadássalDataRelation. Ezt a viselkedést azonban letilthatja úgy, hogy hamis createConstraints = értéket ad meg a kapcsolat létrehozásakor.

ForeignKeyConstraint

A ForeignKeyConstraint kényszeríti a kapcsolódó táblák frissítéseinek és törlésének propagálására vonatkozó szabályokat. Ha például egy tábla sorában lévő érték frissül vagy törölve van, és ugyanazt az értéket egy vagy több kapcsolódó táblában is használják, a ForeignKeyConstraint határozza meg, hogy mi történik a kapcsolódó táblákban.

A DeleteRule ForeignKeyConstraint és UpdateRule a tulajdonságok határozzák meg azt a műveletet, amely akkor lesz végrehajtva, amikor a felhasználó egy kapcsolódó tábla sorát megkísérli törölni vagy frissíteni. Az alábbi táblázat a ForeignKeyConstraint DeleteRule és UpdateRule tulajdonságaihoz elérhető különböző beállításokat ismerteti.

Szabálybeállítás Leírás
Cascade Kapcsolódó sorok törlése vagy frissítése.
SetNull Állítsa be a kapcsolódó sorok értékeit a DBNull értékre.
SetDefault Állítsa be a kapcsolódó sorok értékeit az alapértelmezett értékre.
Egyik sem A kapcsolódó sorokon nem hajt végre műveletet. Ez az alapértelmezett beállítás.

A ForeignKeyConstraint korlátozhatja és propagálja a kapcsolódó oszlopok módosításait . Egy oszlop ForeignKeyConstraint tulajdonságának tulajdonságaitól függően, ha az AdathalmazEnforceConstraints tulajdonsága igaz, a szülősor bizonyos műveleteinek végrehajtása kivételt eredményez. Ha például a ForeignKeyConstraint DeleteRule tulajdonsága Nincs, a szülősor nem törölhető, ha gyermeksorokat tartalmaz.

A ForeignKeyConstraint konstruktor használatával idegenkulcs-korlátozást hozhat létre egyetlen oszlop vagy oszloptömb között. Adja át az eredményül kapott ForeignKeyConstraint objektumot a tábla Constraints tulajdonságának Add metódusának, amely egy ConstraintCollection. Konstruktorargumentumokat a ConstraintCollection Add metódusának több túlterhelésére is átadhat a ForeignKeyConstraint létrehozásához.

A ForeignKeyConstraint létrehozásakor a DeleteRule és az UpdateRule értékeket argumentumként továbbíthatja a konstruktornak, vagy beállíthatja őket tulajdonságokként az alábbi példában (ahol a DeleteRule érték Nincs értékre van állítva).

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

A sorok módosításai az AcceptChanges metódussal fogadhatók el, vagy a DataSet, a DataTable vagy a DataRow RejectChanges metódusával törölhetők. Ha egy adatkészlet ForeignKeyConstraints-et tartalmaz, az AcceptChanges vagy a RejectChanges metódus meghívása kényszeríti az AcceptRejectRule-t. A ForeignKeyConstraint AcceptRejectRule tulajdonsága határozza meg, hogy milyen műveletet hajt végre a gyermeksorokon, amikor az AcceptChanges vagy az RejectChanges meghívást kap a szülősoron.

Az alábbi táblázat az AcceptRejectRule elérhető beállításait sorolja fel.

Szabálybeállítás Leírás
Cascade Gyermeksorok módosításainak elfogadása vagy elvetése.
Egyik sem Ne tegyen műveletet a gyermeksorokon. Ez az alapértelmezett beállítás.

Példa

Az alábbi példa létrehoz egy ForeignKeyConstraint, több tulajdonságát, köztük az AcceptRejectRuleobjektumot, és hozzáadja egy ConstraintCollectionDataTable objektumhoz.

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

A UniqueConstraint objektum, amely egyetlen oszlophoz vagy egy DataTable oszloptömbhöz rendelhető, biztosítja, hogy a megadott oszlop vagy oszlopok minden adata soronként egyedi legyen. A UniqueConstraint konstruktor használatával egyedi kényszert hozhat létre egy oszlophoz vagy oszloptömbhöz. Adja át az eredményül kapott UniqueConstraint objektumot a tábla ConstraintCollection tulajdonságának Add metódusának. Konstruktorargumentumokat a ConstraintCollection Add metódusának több túlterhelésére is átadhat egy UniqueConstraint létrehozásához. Egy oszlophoz vagy oszlophoz tartozó UniqueConstraint létrehozásakor megadhatja, hogy az oszlop vagy oszlopok elsődleges kulcsok-e.

Az oszlop egyedi korlátozását úgy is létrehozhatja, hogy az oszlop Egyedi tulajdonságát igaz értékre állítja. Másik lehetőségként, ha egyetlen oszlop Egyedi tulajdonságát hamisra állítja, azzal eltávolítja az esetlegesen fennálló egyedi kényszereket. Ha egy oszlopot vagy oszlopot a tábla elsődleges kulcsaként határoz meg, automatikusan egyedi kényszert hoz létre a megadott oszlophoz vagy oszlopokhoz. Ha eltávolít egy oszlopot egy DataTable PrimaryKey tulajdonságából, a UniqueConstraint el lesz távolítva.

Az alábbi példa létrehoz egy UniqueConstraint-et egy DataTable két oszlopához.

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

Lásd még