Navegar por objetos DataRelation

Una de las principales funciones de una DataRelation es permitir la navegación de una DataTable a otra dentro de un DataSet. Esto permite recuperar todos los objetos DataRow relacionados de una DataTable cuando se da una única DataRow de una DataTable relacionada. Por ejemplo, después de establecer un objeto DataRelation entre una tabla de clientes y una tabla de pedidos, es posible recuperar todas las filas de pedidos de una fila de clientes determinada mediante GetChildRows.

En el siguiente ejemplo de código se crea un objeto DataRelation entre la tabla Customers y la tabla Orders de un DataSet, y se devuelven todos los pedidos de cada cliente.

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. Como en el ejemplo anterior, CustomerID relaciona la tabla Customers con la tabla Orders. 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 concreto y sus valores de OrderID.

El ejemplo ampliado también devuelve los valores de las tablas OrderDetails y Products. La tabla Orders está relacionada con la tabla OrderDetails mediante OrderID con el fin de determinar, para cada pedido de cliente, qué productos y cantidades se pidieron. Como la tabla OrderDetails solo contiene el ProductID de un producto pedido, OrderDetails está relacionada con Products mediante ProductID para devolver el ProductName. En esta relación, Products es la tabla primaria y Order Details es la secundaria. Por lo tanto, al recorrer en iteración la tabla OrderDetails, se llama a GetParentRow para recuperar el valor de ProductName relacionado.

Hay que tener en cuenta que al crear la DataRelation para las tablas Customers y Orders no se especifica ningún valor para la marca createConstraints (el valor predeterminado es true). Se supone que todas las filas de la tabla Orders tienen un valor CustomerID que existe en la tabla primaria Customers. Si un CustomerID existe en la tabla Orders pero no existe en la tabla Customers, una ForeignKeyConstraint hará que se genere una excepción.

Si la columna secundaria puede contener valores no incluidos en la columna primaria, establezca la marca createConstraints en false al agregar DataRelation. En el ejemplo, la marca createConstraints se establece en false para la DataRelation entre las tablas Orders y OrderDetails. 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. El ejemplo ampliado genera el resultado con el siguiente formato.

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, y solo se devuelve un subconjunto de los registros de la tabla 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

Consulte también