語言

DataTable 限制條件

您可以使用條件約束來強制執行 中 DataTable數據的限制,以維護數據的完整性。 條件約束是套用至數據行或相關數據行的自動規則,會在數據列的值以某種方式改變時決定動作過程。 當 的 System.Data.DataSet.EnforceConstraints 屬性為 DataSet 時,會強制執行條件約束。 若需查看如何設定EnforceConstraints屬性的程式碼範例,請參閱EnforceConstraints參考主題。

ADO.NET 有兩種條件約束: ForeignKeyConstraint 和 UniqueConstraint。 根據預設,當您藉由將 新增 DataRelation 至 DataSet,建立兩個或多個數據表之間的關聯性時,會自動建立這兩個條件約束。 不過,你可以在建立關聯時指定 createConstraints = false 這個行為來停用。

外鍵約束

A ForeignKeyConstraint 強制執行關於如何將更新與刪除傳遞到相關資料表的規則。 例如,如果某個資料表的某一列值被更新或刪除,且該值同時被用於一個或多個相關資料表,a ForeignKeyConstraint 決定了相關資料表中發生的事。

DeleteRule的 和 UpdateRule 屬性ForeignKeyConstraint定義了當使用者嘗試刪除或更新相關資料表中某一列時要執行的動作。 下表說明了 DeleteRule 和 UpdateRule 屬性在 ForeignKeyConstraint 可用的不同設定。

規則設定 說明
級聯 刪除或更新相關的數據列。
SetNull 將相關數據列中的值設定為 DBNull。
設為預設 將相關數據列中的值設定為預設值。
沒有 對相關數據列不採取任何動作。 這是預設值。

A ForeignKeyConstraint 可以限制並傳播相關欄位的變更。 根據欄位 的 ForeignKeyConstraint 屬性設定,若 EnforceConstraints 的屬性 DataSet 為 真,對父列執行某些操作會導致異常。 例如,若 DeleteRule 的 ForeignKeyConstraint 屬性為 None,則若父列中有任何子列,則無法刪除。

你可以利用 ForeignKeyConstraint 建構子在單欄間或一組列間建立外鍵約束。 將所得 ForeignKeyConstraint 物件傳給 Add 資料表 Constraints 屬性的方法,也就是 ConstraintCollection。 你也可以將構造函數參數傳遞給 Add 方法的多個重載版本 ConstraintCollection,以建立 ForeignKeyConstraint。

建立 ForeignKeyConstraint 時,你可以將 DeleteRule 和 UpdateRule 的值以參數形式傳遞給建構子,或者像以下範例中一樣,將它們設為屬性(其中 DeleteRule 的值設為 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);

接受拒絕規則

資料列的變更可以透過此 AcceptChanges 方法接受,或透過 RejectChangesDataSet、 DataTable 或 DataRow 的方法取消。 當 a DataSet 包含 ForeignKeyConstraints 時,呼叫 AcceptChanges or RejectChanges 方法會強制執行 AcceptRejectRule。 AcceptRejectRule的ForeignKeyConstraint屬性決定了當 AcceptChanges 或 RejectChanges 在父列被呼叫時,子列會採取什麼動作。

下表列出 AcceptRejectRule 的可用設定。

規則設定 說明
級聯 接受或拒絕子數據列的變更。
沒有 對子數據列不採取任何動作。 這是預設值。

範例

下列範例會建立ForeignKeyConstraint,並設定多個屬性,包括AcceptRejectRule,然後將它新增至ConstraintCollection物件的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 建構子為欄位或欄位陣列建立唯一的限制。 將所得 UniqueConstraint 物件傳給 Add 資料表 Constraints 屬性的方法,也就是 ConstraintCollection。 你也可以將建構子參數傳遞給 Add 的多個重載 ConstraintCollection 方法,以建立 UniqueConstraint。 在為某欄或多個欄位建立 A UniqueConstraint 時,你可以選擇性地指定該欄位是否為主鍵。

你也可以將欄位的屬性設 Unique 為 true,來建立唯一的限制。 或者,將 Unique 單一欄位的屬性設為 false 移除任何可能存在的唯一限制。 將數據行或數據行定義為數據表的主鍵,會自動為指定的數據行或數據行建立唯一條件約束。 如果你從 PrimaryKey 的屬性中移除欄位,該欄位UniqueConstraint就會被移除。

以下範例為兩欄的 UniqueConstraint 建立一個 。

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

另請參閱