Navegar por objetos DataRelationNavigating DataRelations

Una de las principales funciones de una DataRelation es permitir la navegación de una DataTable a otra dentro de un DataSet.One of the primary functions of a DataRelation is to allow navigation from one DataTable to another within a DataSet. Esto permite recuperar todos DataRow los objetos relacionados en un objeto DataTable cuando se proporciona una única DataRow desde un DataTablerelacionado.This allows you to retrieve all the related DataRow objects in one DataTable when given a single DataRow from a related DataTable. Por ejemplo, después de establecer una DataRelation entre una tabla de clientes y una tabla de pedidos, puede recuperar todas las filas de pedidos de una fila de cliente determinada mediante GetChildRows.For example, after establishing a DataRelation between a table of customers and a table of orders, you can retrieve all the order rows for a particular customer row using GetChildRows.

En el ejemplo de código siguiente se crea una DataRelation entre la tabla Customers y la tabla Orders de un DataSet y se devuelven todos los pedidos de cada cliente.The following code example creates a DataRelation between the Customers table and the Orders table of a DataSet and returns all the orders for each customer.

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

El ejemplo siguiente se basa en el anterior; se relacionan cuatro tablas y se navega por dichas relaciones.The next example builds on the preceding example, relating four tables together and navigating those relationships. Como en el ejemplo anterior, CustomerID relaciona la tabla Customers con la tabla Orders .As in the previous example, CustomerID relates the Customers table to the Orders table. Para cada cliente de la tabla Customers , se determinan todas las filas secundarias de la tabla Orders , con el fin de devolver el número de pedidos que tiene un cliente determinado y sus valores OrderID .For each customer in the Customers table, all the child rows in the Orders table are determined, in order to return the number of orders a particular customer has and their OrderID values.

El ejemplo expandido también devuelve los valores de las tablas OrderDetails y Products .The expanded example also returns the values from the OrderDetails and Products tables. La tabla Orders está relacionada con la tabla OrderDetails mediante OrderID para determinar, para cada pedido de cliente, qué productos y cantidades se han pedido.The Orders table is related to the OrderDetails table using OrderID to determine, for each customer order, what products and quantities were ordered. Dado que la tabla OrderDetails solo contiene el ProductID de un producto pedido, OrderDetails se relaciona con los productos que usan ProductID para devolver el NombreProducto.Because the OrderDetails table only contains the ProductID of an ordered product, OrderDetails is related to Products using ProductID in order to return the ProductName. En esta relación, la tabla Products es el elemento primario y la tabla Order Details es el elemento secundario.In this relation, the Products table is the parent and the Order Details table is the child. Como resultado, al recorrer en iteración la tabla OrderDetails , se llama a GetParentRow para recuperar el valor ProductName relacionado.As a result, when iterating through the OrderDetails table, GetParentRow is called to retrieve the related ProductName value.

Tenga en cuenta que cuando se crea la DataRelation para las tablas Customers y Orders , no se especifica ningún valor para la marca createConstraints (el valor predeterminado es true).Notice that when the DataRelation is created for the Customers and Orders tables, no value is specified for the createConstraints flag (the default is true). Se supone que todas las filas de la tabla Orders tienen un valor CustomerID que existe en la tabla primaria Customers .This assumes that all the rows in the Orders table have a CustomerID value that exists in the parent Customers table. Si existe un CustomerID en la tabla Orders que no existe en la tabla ForeignKeyConstraint customers, se produce una excepción.If a CustomerID exists in the Orders table that does not exist in the Customers table, a ForeignKeyConstraint causes an exception to be thrown.

Cuando la columna secundaria pueda contener valores que no contenga la columna primaria, establezca el marcador createConstraints en false al agregar la DataRelation.When the child column might contain values that the parent column does not contain, set the createConstraints flag to false when adding the DataRelation. En el ejemplo, el marcador createConstraints se establece en false para la DataRelation entre la tabla Orders y la tabla OrderDetails .In the example, the createConstraints flag is set to false for the DataRelation between the Orders table and the OrderDetails table. Esto permite que la aplicación devuelva todos los registros de la tabla OrderDetails y solo un subconjunto de registros de la tabla Orders sin generar una excepción en tiempo de ejecución.This enables the application to return all the records from the OrderDetails table and only a subset of records from the Orders table without generating a run-time exception. El ejemplo ampliado genera el resultado con el siguiente formato.The expanded sample generates output in the following format.

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  

El siguiente ejemplo de código es un ejemplo ampliado en el que se devuelven los valores de las tablas OrderDetails y Products , con solo un subconjunto de los registros de la tabla Orders que se devuelve.The following code example is an expanded sample where the values from the OrderDetails and Products tables are returned, with only a subset of the records in the Orders table being returned.

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

Vea tambiénSee also