Share via


Navegando DataRelations

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

O exemplo de código a seguir cria um DataRelation entre a tabela Customers e a tabela Orders de 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 próximo exemplo se baseia no exemplo anterior, relacionando quatro tabelas juntas e navegando nessas relações. Como no exemplo anterior, CustomerID relaciona a tabela Customers com a tabela Orders. Para cada cliente na tabela Clientes , todas as linhas filhas na tabela Pedidos são determinadas, a fim de retornar o número de pedidos que um cliente específico tem e seus valores de OrderID .

O exemplo expandido também retorna os valores das tabelas OrderDetails e Products . A tabela Pedidos está relacionada à tabela OrderDetails usando OrderID para determinar, para cada pedido do cliente, quais produtos e quantidades foram encomendados. Como a tabela OrderDetails contém apenas o ProductID de um produto encomendado, OrderDetails está relacionado a Produtos que usam ProductID para devolver o ProductName. Nesta relação, a tabela Produtos é o pai e a tabela Detalhes do pedido é o filho. Como resultado, ao iterar através da tabela OrderDetails, GetParentRow é chamado para recuperar o valor ProductName relacionado.

Observe que quando o DataRelation é criado para as tabelas Customers e Orders , nenhum valor é especificado para o sinalizador createConstraints (o padrão é true). Isso pressupõe que todas as linhas na tabela Pedidos tenham um valor CustomerID que existe na tabela Customers pai. Se existir um CustomerID na tabela Orders que não exista na tabela Customers , uma ForeignKeyConstraint exceção será lançada.

Quando a coluna filho pode conter valores que a coluna pai não contém, defina o sinalizador createConstraints como false ao adicionar o DataRelation. No exemplo, o sinalizador createConstraints é definido como false para DataRelation entre a tabela Orders e a tabela OrderDetails. Isso permite que o aplicativo retorne todos os registros da tabela OrderDetails e apenas um subconjunto de registros da tabela Orders sem gerar uma exceção de tempo de execução. O exemplo expandido gera saída no seguinte 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  

O exemplo de código a seguir é um exemplo expandido 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