Parcours des 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. Cela vous permet d’extraire tous les objets DataRow associés dans un DataTable quand un DataRow est fourni à partir d’un DataTable associé. Par exemple, après avoir créé un DataRelation entre une table de clients et une table de commandes, vous pouvez extraire toutes les lignes de commandes pour une ligne de client donnée à l’aide de GetChildRows.

L’exemple de code suivant crée un DataRelation entre les tables Customers (clients) et Orders (commandes) d’un DataSet et retourne toutes les commandes de chaque client.

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. Comme dans l’exemple précédent, CustomerID lie la table Customers à la table Orders. Pour chaque client de la table Customers, toutes les lignes enfants de la table Orders sont déterminées, afin de retourner le nombre de commandes passées par un client et la valeur OrderID de chaque commande.

L’exemple développé retourne aussi les valeurs des tables OrderDetails et Products. La table Orders est associée à la table OrderDetails au moyen de OrderID afin de déterminer, pour chaque client, les produits qui ont été commandés et en quelle quantité. La table OrderDetails ne contenant que le ProductID d’un produit commandé, une relation est créée entre OrderDetails et Products, au moyen de ProductID, afin de retourner le ProductName. Dans cette relation, Products est la table parente et OrderDetails la table enfant. Ainsi, lors de l’itération sur la table OrderDetails, la méthode GetParentRow est appelée pour extraire la valeur ProductName associée.

Notez que quand le DataRelation est créé pour les tables Customers et Orders, aucune valeur n’est spécifiée pour l’indicateur createConstraints (la valeur par défaut est true). Cela suppose que toutes les lignes de la table Orders ont une valeur CustomerID qui existe dans la table parente Customers. Si un CustomerID existe dans la table Orders, mais pas dans la table Customers, un objet ForeignKeyConstraint entraîne la levée d’une exception.

Quand la colonne enfant est susceptible de contenir des valeurs qui ne figurent pas dans la colonne parente, attribuez à l’indicateur createConstraints la valeur false quand vous ajoutez le DataRelation. Dans l’exemple, l’indicateur createConstraints a la valeur false pour le DataRelation établi entre les tables Orders et OrderDetails. L’application peut ainsi retourner tous les enregistrements de la table OrderDetails et seulement un sous-ensemble de la table Orders sans qu’une exception runtime ne soit levée. La sortie de l’exemple développé se présente comme suit.

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 développé pour que soient retournées les valeurs des tables OrderDetails et Products et seulement un sous-ensemble des enregistrements de la table Orders.

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 aussi