Partager via


Exploration des DataRelations (ADO.NET)

Mise à jour : November 2007

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 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 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 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
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());
    }
}

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 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 objet ForeignKeyConstraint entraîne la levée d'une exception.

Lorsque la colonne enfant est susceptible de contenir des valeurs qui ne figurent pas dans la colonne parente, attribuez à 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ées les valeurs des tables OrderDetails et Products et seulement un sous-ensemble des enregistrements de la table Orders.

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
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"]);
        }
    }
}

Voir aussi

Autres ressources

Objets DataSet, DataTable et DataView (ADO.NET)