導覽 DataRelation

DataRelation 的其中一個主要功能,是讓您可以從 DataTable 內的某個 DataSet 巡覽至另一個。 這項功能可讓您在指定了相關 DataTable 的單一 DataRow 時,擷取某個 DataTable 所有相關的 DataRow 物件。 例如,在客戶資料表與訂單資料表之間建立 DataRelation 之後,您就可以使用 GetChildRows 擷取特定客戶資料列的所有訂單資料列。

下列程式碼範例會在 DataSetCustomers 資料表與 Orders 資料表間建立 DataRelation,並傳回每個客戶的所有訂單。

DataRelation customerOrdersRelation =
    customerOrders.Relations.Add("CustOrders",
    customerOrders.Tables["Customers"].Columns["CustomerID"],
    customerOrders.Tables["Orders"].Columns["CustomerID"]);

foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(custRow["CustomerID"].ToString());

    foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation))
    {
        Console.WriteLine(orderRow["OrderID"].ToString());
    }
}
Dim customerOrdersRelation As DataRelation = _
   customerOrders.Relations.Add("CustOrders", _
   customerOrders.Tables("Customers").Columns("CustomerID"), _
   customerOrders.Tables("Orders").Columns("CustomerID"))

Dim custRow, orderRow As DataRow

For Each custRow In customerOrders.Tables("Customers").Rows
    Console.WriteLine("Customer ID:" & custRow("CustomerID").ToString())

    For Each orderRow In custRow.GetChildRows(customerOrdersRelation)
        Console.WriteLine(orderRow("OrderID").ToString())
    Next
Next

下一個範例則是以前述範例為基礎,在四個資料表之間建立關聯,並巡覽其中的關聯性。 如前面範例所述,CustomerIDCustomers 資料表關聯至 Orders 資料表。 針對 Customers 資料表的每個客戶,在 Orders 資料表都已有對應的子資料列,這樣才能傳回特定客戶擁有的訂單數目及其 OrderID 值。

展開的範例也可傳回來自 OrderDetailsProducts 資料表的值。 其中,Orders 資料表與 OrderDetails 資料表有關聯,並且可使用 OrderID 來判斷每個客戶訂單所訂購的產品與數量。 由於 OrderDetails 資料表僅包含訂購產品的 ProductID,因此 OrderDetails 會使用 ProductID 來建立與 Products 的關聯,以傳回 ProductName。 在這項關聯,Products 資料表為父代,而 Order Details 資料表為子系。 因此,逐一查看 OrderDetails 資料表時,會呼叫 GetParentRow 以擷取相關的 ProductName 值。

請注意,CustomersOrders 資料表的 DataRelation 建立後,createConstraints 旗標並沒有指定值 (預設值為 true)。 這是假設 Orders 資料表的所有資料列都具有父代 Customers 資料表的 CustomerID 值。 如果 Orders 資料表的 CustomerID 不存在於 Customers 資料表,則 ForeignKeyConstraint 就會擲回例外狀況。

若子資料行可能包含父代資料行所沒有的值,請在加入 DataRelation 時,將 createConstraints 旗標設定為 false。 在此範例,Orders 資料表與 OrderDetails 資料表間 DataRelation 所屬的 createConstraints 旗標設定為 false。 這樣能使應用程式從 OrderDetails 資料表傳回所有資料,並只從 Orders 資料表傳回記錄的子集,而不會產生執行階段例外狀況。 展開範例會產生下列格式的輸出。

Customer ID: NORTS  
  Order ID: 10517  
        Order Date: 4/24/1997 12:00:00 AM  
           Product: Filo Mix  
          Quantity: 6  
           Product: Raclette Courdavault  
          Quantity: 4  
           Product: Outback Lager  
          Quantity: 6  
  Order ID: 11057  
        Order Date: 4/29/1998 12:00:00 AM  
           Product: Outback Lager  
          Quantity: 3  

下列程式碼範例是展開的範例,其中傳回了 OrderDetailsProducts 資料表的值,並只從 Orders 資料表傳回記錄的子集。

DataRelation customerOrdersRelation =
    customerOrders.Relations.Add("CustOrders",
    customerOrders.Tables["Customers"].Columns["CustomerID"],
    customerOrders.Tables["Orders"].Columns["CustomerID"]);

DataRelation orderDetailRelation =
    customerOrders.Relations.Add("OrderDetail",
    customerOrders.Tables["Orders"].Columns["OrderID"],
    customerOrders.Tables["OrderDetails"].Columns["OrderID"], false);

DataRelation orderProductRelation =
    customerOrders.Relations.Add("OrderProducts",
    customerOrders.Tables["Products"].Columns["ProductID"],
    customerOrders.Tables["OrderDetails"].Columns["ProductID"]);

foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine("Customer ID: " + custRow["CustomerID"]);

    foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation))
    {
        Console.WriteLine("  Order ID: " + orderRow["OrderID"]);
        Console.WriteLine("\tOrder Date: " + orderRow["OrderDate"]);

        foreach (DataRow detailRow in orderRow.GetChildRows(orderDetailRelation))
        {
            Console.WriteLine("\t Product: " +
                detailRow.GetParentRow(orderProductRelation)["ProductName"]);
            Console.WriteLine("\t Quantity: " + detailRow["Quantity"]);
        }
    }
}
Dim customerOrdersRelation As DataRelation = _
   customerOrders.Relations.Add("CustOrders", _
   customerOrders.Tables("Customers").Columns("CustomerID"), _
   customerOrders.Tables("Orders").Columns("CustomerID"))

Dim orderDetailRelation As DataRelation = _
   customerOrders.Relations.Add("OrderDetail", _
   customerOrders.Tables("Orders").Columns("OrderID"), _
   customerOrders.Tables("OrderDetails").Columns("OrderID"), False)

Dim orderProductRelation As DataRelation = _
   customerOrders.Relations.Add("OrderProducts", _
   customerOrders.Tables("Products").Columns("ProductID"), _
   customerOrders.Tables("OrderDetails").Columns("ProductID"))

Dim custRow, orderRow, detailRow As DataRow

For Each custRow In customerOrders.Tables("Customers").Rows
    Console.WriteLine("Customer ID:" & custRow("CustomerID").ToString())

    For Each orderRow In custRow.GetChildRows(customerOrdersRelation)
        Console.WriteLine("  Order ID: " & orderRow("OrderID").ToString())
        Console.WriteLine(vbTab & "Order Date: " & _
          orderRow("OrderDate").ToString())

        For Each detailRow In orderRow.GetChildRows(orderDetailRelation)
            Console.WriteLine(vbTab & "   Product: " & _
              detailRow.GetParentRow(orderProductRelation) _
              ("ProductName").ToString())
            Console.WriteLine(vbTab & "  Quantity: " & _
              detailRow("Quantity").ToString())
        Next
    Next
Next

另請參閱