Parcours des DataRelationsNavigating DataRelations

L'une des principales fonctions d'un objet DataRelation est de permettre de passer d'un objet DataTable à un autre à l'intérieur d'un objet DataSet.One of the primary functions of a DataRelation is to allow navigation from one DataTable to another within a DataSet. Cela vous permet de récupérer tous les connexe DataRow les objets DataTable lorsqu’un DataRow à partir d’un connexes DataTable.This allows you to retrieve all the related DataRow objects in one DataTable when given a single DataRow from a related DataTable. Par exemple, après avoir établi un DataRelation entre une table de clients et une table de commandes, vous pouvez récupérer toutes les lignes de commande pour une ligne de client spécifique à l’aide 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.

L’exemple de code suivant crée un DataRelation entre le clients table et le commandes table d’un DataSet et retourne toutes les commandes pour chaque client.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

L'exemple suivant s'appuie sur le précédent, en créant des relations entre quatre tables et en explorant ces relations.The next example builds on the preceding example, relating four tables together and navigating those relationships. Comme dans l’exemple précédent, CustomerID se rapporte la clients de la table vers le commandes table.As in the previous example, CustomerID relates the Customers table to the Orders table. Pour chaque client dans le clients table, toutes les lignes enfants de la commandes table sont déterminées, afin de retourner le nombre de commandes passées par un client et leurs OrderID valeurs.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.

L’exemple développé retourne également les valeurs à partir de la OrderDetails et produits tables.The expanded example also returns the values from the OrderDetails and Products tables. Le commandes table est associée à la OrderDetails à l’aide de la table OrderID pour déterminer, pour chaque commande client, de quels produits et quantités commandées.The Orders table is related to the OrderDetails table using OrderID to determine, for each customer order, what products and quantities were ordered. Étant donné que le OrderDetails table contient uniquement le ProductID d’un produit commandé, OrderDetails est liée à produits à l’aide de ProductID afin de retourner le ProductName.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. Dans cette relation, le produits est la table parente et la Order Details table est l’enfant.In this relation, the Products table is the parent and the Order Details table is the child. Par conséquent, lors de l’itération via la OrderDetails table, GetParentRow est appelée pour extraire la ProductName valeur.As a result, when iterating through the OrderDetails table, GetParentRow is called to retrieve the related ProductName value.

Notez que lorsque le DataRelation est créé pour le clients et commandes tables, aucune valeur n’est spécifiée pour le createConstraintsindicateur (la valeur par défaut est 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). Cela suppose que toutes les les lignes dans le commandes table ont une CustomerID valeur qui existe dans le parent clients table.This assumes that all the rows in the Orders table have a CustomerID value that exists in the parent Customers table. Si un CustomerID existe dans le commandes table qui n’existe pas dans le clients table, un ForeignKeyConstraint provoque une exception levée.If a CustomerID exists in the Orders table that does not exist in the Customers table, a ForeignKeyConstraint causes an exception to be thrown.

Lorsque la colonne enfant peut contenir des valeurs de la colonne parent ne contient-elle pas, définissez le createConstraints indicateur false lors de l’ajout du 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. Dans l’exemple, le createConstraints indicateur a la valeur false pour le DataRelation entre le commandes table et le OrderDetails table.In the example, the createConstraints flag is set to false for the DataRelation between the Orders table and the OrderDetails table. Cela permet à l’application retourner tous les enregistrements à partir de la OrderDetails table et uniquement un sous-ensemble d’enregistrements à partir de la commandes table sans générer une exception au moment de l’exécution.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. La sortie de l’exemple développé se présente comme suit.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  

L’exemple de code suivant est un exemple développé où les valeurs à partir de la OrderDetails et produits les tables sont retournées, avec uniquement un sous-ensemble des enregistrements dans la commandestable qui est retournée.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

Voir aussiSee also