导航 DataRelation

一个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由于该表仅包含ProductID已订购的产品,OrderDetails因此与Products使用ProductID来返回 ProductName 相关。 在此关系中,表 Products 是父表,Order Details 表是子表。 因此,遍历 OrderDetails 表时,会调用 GetParentRow 以检索相关的 ProductName 值。

请注意,当为DataRelationCustomers表创建Orders时,并未为createConstraints标志指定任何值(默认值为true)。 这假定表中的所有行Orders都具有父CustomerIDCustomers表中存在的值。 如果CustomerIDOrders表中存在而在Customers表中不存在,ForeignKeyConstraint会导致引发异常。

当子列可能包含父列未包含的值时,添加 createConstraints 时,请将标志 false 设置为 。 在此示例中,createConstraints标志被设置为false,用于DataRelation表和Orders表之间的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

另请参阅