¿Le resultó útil esta página?
Sus comentarios sobre este contenido son muy importantes. Háganos saber su opinión.
¿Tiene comentarios adicionales?
Caracteres restantes: 1500
Exportar (0) Imprimir
Expandir todo
Importante Es posible que este documento no represente los procedimientos recomendados para el desarrollo actual. Puede que los vínculos a las descargas y otros recursos ya no sean válidos. Encontrará aquí la versión que se recomienda en la actualidad.

Navegar por DataRelations (ADO.NET)

Actualización: November 2007

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


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 sólo 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 el marcador 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 inicie una excepción.

Cuando la columna secundaria pueda contener valores no incluidos en la columna primaria, hay que asignar el valor false al marcador createConstraints cuando se agregue la DataRelation. En el ejemplo, el marcador createConstraints tiene el valor 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 sólo 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 sólo 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"]);
        }
    }
}


Adiciones de comunidad

AGREGAR
Mostrar:
© 2015 Microsoft