Navegando em DataRelationsNavigating DataRelations

Uma das principais funções de um DataRelation é permitir a navegação de um DataTable para outro em um DataSet.One of the primary functions of a DataRelation is to allow navigation from one DataTable to another within a DataSet. Isso permite que você recupere todos os DataRow objetos relacionados em uma DataTable quando recebe uma única DataRow de uma DataTable relacionada.This allows you to retrieve all the related DataRow objects in one DataTable when given a single DataRow from a related DataTable. Por exemplo, depois de estabelecer uma DataRelation entre uma tabela de clientes e uma tabela de pedidos, você pode recuperar todas as linhas de ordem de uma linha de cliente específica usando GetChildRows.For example, after establishing a DataRelation between a table of customers and a table of orders, you can retrieve all the order rows for a particular customer row using GetChildRows.

O exemplo de código a seguir cria uma DataRelation entre a tabela Customers e a tabela Orders de um DataSet e retorna todos os pedidos para cada cliente.The following code example creates a DataRelation between the Customers table and the Orders table of a DataSet and returns all the orders for each customer.

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 se baseia no exemplo anterior, relacionando quatro tabelas juntas e navegando nessas relações.The next example builds on the preceding example, relating four tables together and navigating those relationships. Como no exemplo anterior, CustomerID relaciona a tabela Customers à tabela Orders .As in the previous example, CustomerID relates the Customers table to the Orders table. Para cada cliente na tabela Customers , todas as linhas filho na tabela Orders são determinadas para retornar o número de pedidos que um cliente específico tem e seus valores de OrderID .For each customer in the Customers table, all the child rows in the Orders table are determined, in order to return the number of orders a particular customer has and their OrderID values.

O exemplo expandido também retorna os valores das tabelas OrderDetails e Products .The expanded example also returns the values from the OrderDetails and Products tables. A tabela pedidos está relacionada à tabela OrderDetails usando OrderID para determinar, para cada pedido de cliente, quais produtos e quantidades foram ordenados.The Orders table is related to the OrderDetails table using OrderID to determine, for each customer order, what products and quantities were ordered. Como a tabela OrderDetails contém apenas a ProductID de um produto ordenado, o OrderDetails está relacionado aos produtos que usam ProductID para retornar o NomeDoProduto.Because the OrderDetails table only contains the ProductID of an ordered product, OrderDetails is related to Products using ProductID in order to return the ProductName. Nessa relação, a tabela produtos é o pai e a tabela detalhes do pedido é o filho.In this relation, the Products table is the parent and the Order Details table is the child. Como resultado, ao iterar pela tabela OrderDetails , GetParentRow é chamado para recuperar o valor de NomeDoProduto relacionado.As a result, when iterating through the OrderDetails table, GetParentRow is called to retrieve the related ProductName value.

Observe que, quando a DataRelation é criada para as tabelas Customers e Orders , nenhum valor é especificado para o sinalizador createConstraints (o padrão é true).Notice that when the DataRelation is created for the Customers and Orders tables, no value is specified for the createConstraints flag (the default is true). Isso pressupõe que todas as linhas na tabela Orders têm um valor CustomerID que existe na tabela Parent Customers .This assumes that all the rows in the Orders table have a CustomerID value that exists in the parent Customers table. Se um CustomerID existir na tabela Orders que não existe na tabela Customers , um ForeignKeyConstraint fará com que uma exceção seja gerada.If a CustomerID exists in the Orders table that does not exist in the Customers table, a ForeignKeyConstraint causes an exception to be thrown.

Quando a coluna filho pode conter valores que a coluna pai não contém, defina o sinalizador createConstraints como false ao adicionar a DataRelation.When the child column might contain values that the parent column does not contain, set the createConstraints flag to false when adding the DataRelation. No exemplo, o sinalizador createConstraints é definido como false para a DataRelation entre a tabela Orders e a tabela OrderDetails .In the example, the createConstraints flag is set to false for the DataRelation between the Orders table and the OrderDetails table. 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 em tempo de execução.This enables the application to return all the records from the OrderDetails table and only a subset of records from the Orders table without generating a run-time exception. O exemplo expandido gera saída no formato a seguir.The expanded sample generates output in the following format.

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 em que os valores das tabelas OrderDetails e Products são retornados, com apenas um subconjunto dos registros na tabela Orders que está sendo retornada.The following code example is an expanded sample where the values from the OrderDetails and Products tables are returned, with only a subset of the records in the Orders table being returned.

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émSee also