Partager via


Exploration d'une relation entre tables

L'une des fonctions premières d'un DataRelation est de permettre le déplacement d'un DataTable à un autre au sein d'un DataSet. Cela vous permet d'extraire tous les objets DataRow associés dans un DataTable lorsqu'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 DataRow.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.

Dim custOrderRel As DataRelation = custDS.Relations.Add("CustOrders", _
                     custDS.Tables("Customers").Columns("CustomerID"), _
                     custDS.Tables("Orders").Columns("CustomerID")) 

Dim custRow As DataRow
Dim orderRow As DataRow

For Each custRow in custDS.Tables("Customers").Rows
  Console.WriteLine(custRow("CustomerID"))
  For Each orderRow in custRow.GetChildRows(custOrderRel)
    Console.WriteLine(orderRow("OrderID"))
  Next
Next
[C#]
DataRelation custOrderRel = custDS.Relations.Add("CustOrders",
                     custDS.Tables["Customers"].Columns["CustomerID"],
                     custDS.Tables["Orders"].Columns["CustomerID"]);
foreach (DataRow custRow in custDS.Tables["Customers"].Rows)
{
  Console.WriteLine(custRow["CustomerID"]);
  foreach (DataRow orderRow in custRow.GetChildRows(custOrderRel))
    Console.WriteLine(orderRow["OrderID"]);
}

L'exemple suivant ajoute au 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 enrichi 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 lorsque 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 ForeignKeyConstraint entraînera la levée d'une exception.

Lorsque la colonne enfant est susceptible de contenir des valeurs qui ne figurent pas dans la colonne parente, assignez à l'indicateur createConstraints la valeur false lorsque 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 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 enrichi pour que soient retournés les valeurs des tables OrderDetails et Products et seulement un sous-ensemble des enregistrements de la table Orders.

Dim custOrderRel As DataRelation = custDS.Relations.Add("CustOrders", _
                     custDS.Tables("Customers").Columns("CustomerID"), _
                     custDS.Tables("Orders").Columns("CustomerID"))

Dim orderDetailRel As DataRelation = custDS.Relations.Add("OrderDetail", _
                     custDS.Tables("Orders").Columns("OrderID"), _
                     custDS.Tables("OrderDetails").Columns("OrderID"), false)

Dim orderProductRel As DataRelation = custDS.Relations.Add("OrderProducts", _
                     custDS.Tables("Products").Columns("ProductID"), _
                     custDS.Tables("OrderDetails").Columns("ProductID"))

Dim custRow, orderRow, detailRow As DataRow

For Each custRow In custDS.Tables("Customers").Rows
  Console.WriteLine("Customer ID:" & custRow("CustomerID").ToString())

  For Each orderRow In custRow.GetChildRows(custOrderRel)
    Console.WriteLine("  Order ID: " & orderRow("OrderID").ToString())
    Console.WriteLine(vbTab & "Order Date: " & orderRow("OrderDate").ToString())

    For Each detailRow In orderRow.GetChildRows(orderDetailRel)
        Console.WriteLine(vbTab & "   Product: " & detailRow.GetParentRow(orderProductRel)("ProductName").ToString())
        Console.WriteLine(vbTab & "  Quantity: " & detailRow("Quantity").ToString())
    Next
  Next
Next
[C#]
DataRelation custOrderRel = custDS.Relations.Add("CustOrders",
                     custDS.Tables["Customers"].Columns["CustomerID"],
                     custDS.Tables["Orders"].Columns["CustomerID"]);

DataRelation orderDetailRel = custDS.Relations.Add("OrderDetail",
                     custDS.Tables["Orders"].Columns["OrderID"],
                     custDS.Tables["OrderDetails"].Columns["OrderID"], false);

DataRelation orderProductRel = custDS.Relations.Add("OrderProducts",
                     custDS.Tables["Products"].Columns["ProductID"],
                     custDS.Tables["OrderDetails"].Columns["ProductID"]);

foreach (DataRow custRow in custDS.Tables["Customers"].Rows)
{
  Console.WriteLine("Customer ID: " + custRow["CustomerID"]);

  foreach (DataRow orderRow in custRow.GetChildRows(custOrderRel))
  {
    Console.WriteLine("  Order ID: " + orderRow["OrderID"]);
    Console.WriteLine("\tOrder Date: " + orderRow["OrderDate"]);

    foreach (DataRow detailRow in orderRow.GetChildRows(orderDetailRel))
    {
        Console.WriteLine("\t   Product: " + detailRow.GetParentRow(orderProductRel)["ProductName"]);
        Console.WriteLine("\t  Quantity: " + detailRow["Quantity"]);
    }
  }
}

Voir aussi

Création et utilisation de DataSets | DataRelation, classe | DataRow, classe | DataSet, classe