瀏覽 DataRelation (ADO.NET)

更新: November 2007

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

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

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

下一個範例則是以前述範例為基礎,在四個資料表之間建立關聯,並巡覽其中的關聯性。如前面範例所述,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 資料表傳回記錄的子集。

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
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"]);
        }
    }
}

請參閱

其他資源

DataSet、DataTable 及 DataView (ADO.NET)