共用方式為


導覽資料關係

DataRelation的其中一個主要功能是允許在DataTable内部從一個DataSet巡覽到另一個DataSet。 當給定來自相關DataRow中的單一DataTable物件時,這讓你能在一次DataRow檢索中取得所有相關物件。 例如,在建立客戶資料表與訂單資料表之間的 DataRelation 關係後,你可以使用 GetChildRows 取得某一特定客戶資料列的所有相關訂單列。

以下程式碼範例在 DataRelation 表格與 Customers 表格之間建立 Orders,並回傳每位客戶的所有訂單。

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表格僅包含已排序產品的ProductIDOrderDetails藉由使用Products來相關聯,以回傳ProductID。 在此關係中, Products 資料表為父資料表,訂單 細節 資料表為子資料表。 因此,當在資料 OrderDetails 表中迭代時, GetParentRow 會被呼叫以取得相關 ProductName 值。

請注意,當為 DataRelationCustomers 資料表建立 Orders 時,createConstraints 標誌未指定任何值(預設為)。 這假設表格中 Orders 所有列的 CustomerID 值都存在於父 Customers 表格中。 如果CustomerID中的項目存在於資料表中,但不存在於Orders資料表中,則Customers會引發一個例外。

當子欄位可能包含父欄位不包含的值時,加入 createConstraints 時將旗標設false 。 在此範例中,將createConstraints標誌設為false,以表示DataRelationOrders表格與OrderDetails表格之間。 這使應用程式能夠從 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

另請參閱