Navegar por DataRelations (ADO.NET)
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.
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());
}
}
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 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 inicie una excepción.
Cuando la columna secundaria pueda contener valores no incluidos en la columna primaria, hay que asignar el valor false a la marca createConstraints cuando se agregue la DataRelation. En el ejemplo, la marca 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.
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"]);
}
}
}