Compartilhar via


Navegando em DataRelations

Uma das principais funções de um DataRelation é permitir a navegação de um DataTable para outro em um DataSet. Isso permite que você recupere todos os objetos relacionados DataRow em um DataTable quando dado um único DataRow de um DataTable relacionado. Por exemplo, depois de estabelecer uma DataRelation entre uma tabela de clientes e uma tabela de pedidos, você pode recuperar todas as linhas de pedido para uma linha de cliente específica usando GetChildRows.

O exemplo de código a seguir cria um DataRelation entre as tabelas Customers e Orders em um DataSet e retorna todos os pedidos para 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

O exemplo a seguir baseia-se no exemplo anterior, relacionando quatro tabelas e navegando nessas relações. Como no exemplo anterior, CustomerID relaciona a Customers tabela à Orders tabela. Para cada cliente na tabela Customers, todas as linhas filhas na tabela Orders são determinadas, a fim de retornar o número de pedidos de um cliente específico e os respectivos OrderID valores.

O exemplo expandido também retorna os valores das tabelas OrderDetails e Products. A Orders tabela está relacionada à OrderDetails tabela que usa OrderID para determinar, para cada pedido do cliente, quais produtos e quantidades foram ordenados. Como a OrderDetails tabela contém apenas o ProductID de um produto encomendado, OrderDetails está relacionada ao Products usando ProductID para retornar o nome do produto ProductName. Nessa relação, a Products tabela é o pai e a tabela Detalhes do Pedido é o filho. Como resultado, ao iterar na tabela OrderDetails, GetParentRow é chamado para recuperar o valor ProductName relacionado.

Observe que, quando a DataRelation é criada para as tabelas Customers e Orders, nenhum valor é especificado para o createConstraints indicador (o padrão é verdadeiro). Isso pressupõe que todas as linhas da Orders tabela tenham um CustomerID valor que existe na tabela pai Customers . Se CustomerID existir na tabela Orders que não existe na tabela Customers, ForeignKeyConstraint gera uma exceção.

Quando a coluna filho pode conter valores que a coluna pai não contém, defina o createConstraints sinalizador para false quando adicionar o DataRelation. No exemplo, o createConstraints sinalizador é definido como false no DataRelation entre a tabela Orders e a tabela OrderDetails. Isso permite que o aplicativo retorne todos os registros da OrderDetails tabela e apenas um subconjunto de registros da Orders tabela sem gerar uma exceção de runtime. O exemplo expandido gera saída no formato a seguir.

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

O exemplo de código a seguir é uma amostra expandida onde os valores das tabelas OrderDetails e Products são retornados, com apenas um subconjunto dos registros na tabela Orders sendo retornado.

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 também