Ograniczenia elementu DataTable

Ograniczenia umożliwiają wymuszanie ograniczeń dotyczących danych w obiekcie DataTablew celu zachowania integralności danych. Ograniczenie to reguła automatyczna zastosowana do kolumny lub powiązanych kolumn, która określa przebieg akcji, gdy wartość wiersza zostanie w jakiś sposób zmieniona. Ograniczenia są wymuszane, gdy System.Data.DataSet.EnforceConstraints właściwość właściwości ma wartość trueDataSet. Przykładowy kod pokazujący sposób ustawiania EnforceConstraints właściwości można znaleźć w temacie referencyjnym EnforceConstraints .

Istnieją dwa rodzaje ograniczeń w ADO.NET: i ForeignKeyConstraintUniqueConstraint. Domyślnie oba ograniczenia są tworzone automatycznie podczas tworzenia relacji między co najmniej dwiema tabelami przez dodanie elementu DataRelation do zestawu danych. Można jednak wyłączyć to zachowanie, określając wartość createConstraints = false podczas tworzenia relacji.

Foreignkeyconstraint

Funkcja ForeignKeyConstraint wymusza reguły dotyczące sposobu propagacji aktualizacji i usuwania powiązanych tabel. Jeśli na przykład wartość w wierszu jednej tabeli jest aktualizowana lub usuwana, a ta sama wartość jest również używana w co najmniej jednej powiązanej tabeli, wartość ForeignKeyConstraint określa, co dzieje się w powiązanych tabelach.

Właściwości DeleteRulei UpdateRule ForeignKeyConstraint definiują akcję, która ma zostać podjęta, gdy użytkownik próbuje usunąć lub zaktualizować wiersz w powiązanej tabeli. W poniższej tabeli opisano różne ustawienia dostępne dla właściwości DeleteRule i UpdateRule elementu ForeignKeyConstraint.

Ustawienie reguły opis
Kaskadowo Usuń lub zaktualizuj powiązane wiersze.
Setnull Ustaw wartości w powiązanych wierszach na DBNull.
SetDefault Ustaw wartości w powiązanych wierszach na wartość domyślną.
Brak Nie podejmij żadnej akcji w powiązanych wierszach. Jest to opcja domyślna.

Wartość ForeignKeyConstraint może ograniczać, a także propagować zmiany w powiązanych kolumnach. W zależności od właściwości ustawionych dla parametru ForeignKeyConstraint kolumny, jeśli właściwość EnforceConstraints zestawu danych ma wartość true, wykonanie pewnych operacji w wierszu nadrzędnym spowoduje wyjątek. Jeśli na przykład właściwość DeleteRule elementu ForeignKeyConstraint to None, nie można usunąć wiersza nadrzędnego, jeśli zawiera on wiersze podrzędne.

Ograniczenie klucza obcego można utworzyć między pojedynczymi kolumnami lub między tablicą kolumn przy użyciu konstruktora ForeignKeyConstraint . Przekaż wynikowy obiekt ForeignKeyConstraint do metody Add właściwości Constraints tabeli, która jest constraintCollection. Argumenty konstruktora można również przekazać do kilku przeciążeń metody Add obiektu ConstraintCollection w celu utworzenia elementu ForeignKeyConstraint.

Podczas tworzenia wartości ForeignKeyConstraint można przekazać wartości DeleteRule i UpdateRule do konstruktora jako argumenty lub można ustawić je jako właściwości, jak w poniższym przykładzie (gdzie wartość DeleteRule jest ustawiona 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

Zmiany w wierszach można zaakceptować przy użyciu metody AcceptChanges lub anulować przy użyciu metody RejectChanges zestawu danych, tabeli DataTable lub DataRow. Gdy element DataSet zawiera ograniczenia ForeignKey, wywołanie metod AcceptChanges lub RejectChanges wymusza metodę AcceptRejectRule. Właściwość AcceptRejectRule elementu ForeignKeyConstraint określa, która akcja zostanie podjęta w wierszach podrzędnych, gdy element AcceptChanges lub RejectChanges jest wywoływany w wierszu nadrzędnym.

W poniższej tabeli wymieniono dostępne ustawienia elementu AcceptRejectRule.

Ustawienie reguły opis
Kaskadowo Zaakceptuj lub odrzuć zmiany w wierszach podrzędnych.
Brak Nie podejmij żadnej akcji w wierszach podrzędnych. Jest to opcja domyślna.

Przykład

Poniższy przykład tworzy obiekt ForeignKeyConstraint, ustawia kilka jego właściwości, w tym AcceptRejectRule, i dodaje go do ConstraintCollectionDataTable obiektu .

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

Obiekt UniqueConstraint , który można przypisać do pojedynczej kolumny lub do tablicy kolumn w tabeli DataTable, zapewnia, że wszystkie dane w określonej kolumnie lub kolumnach są unikatowe dla każdego wiersza. Możesz utworzyć unikatowe ograniczenie dla kolumny lub tablicy kolumn przy użyciu konstruktora UniqueConstraint . Przekaż wynikowy obiekt UniqueConstraint do metody Add właściwości Constraints tabeli, która jest elementem ConstraintCollection. Argumenty konstruktora można również przekazać do kilku przeciążeń metody Add obiektu ConstraintCollection w celu utworzenia obiektu UniqueConstraint. Podczas tworzenia kolumny lub kolumny UniqueConstraint można opcjonalnie określić, czy kolumna lub kolumny są kluczem podstawowym.

Możesz również utworzyć unikatowe ograniczenie dla kolumny, ustawiając właściwość Unique kolumny na true. Alternatywnie ustawienie właściwości Unique pojedynczej kolumny na false powoduje usunięcie wszelkich unikatowych ograniczeń, które mogą istnieć. Definiowanie kolumn lub kolumn jako klucza podstawowego dla tabeli spowoduje automatyczne utworzenie unikatowego ograniczenia dla określonej kolumny lub kolumn. Jeśli usuniesz kolumnę z właściwości PrimaryKey tabeli DataTable, właściwość UniqueConstraint zostanie usunięta.

W poniższym przykładzie zostanie utworzona kolumna UniqueConstraint dla dwóch kolumn tabeli 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);  

Zobacz też