Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’une des fonctions principales d’un DataRelation est d’autoriser la navigation entre l’un et l’autre DataTable au sein d’un DataSet. Cela vous permet de récupérer tous les objets associés DataRow en une seule opération DataTable lorsqu'un seul DataRow est fourni à partir d’un DataTable associé. Par exemple, après avoir établi une relation entre une table de clients et une table de commandes, vous pouvez récupérer toutes les lignes de commande pour une ligne client donnée à l’aide de DataRelation.
L’exemple de code suivant crée une DataRelation entre la Customers table et la Orders table d’un DataSet et retourne toutes les commandes pour 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 associe la Customers table à la Orders table. Pour chaque client de la Customers table, toutes les lignes enfants de la Orders table sont déterminées, afin de retourner le nombre de commandes qu’un client particulier a et leurs OrderID valeurs.
L’exemple développé retourne également les valeurs des tables OrderDetails et Products. La table Orders est liée à la table OrderDetails grâce à OrderID pour déterminer, pour chaque commande client, quels produits et quantités ont été commandés. Étant donné que la OrderDetails table contient uniquement le ProductID produit commandé, OrderDetails elle est liée à Products l’utilisation ProductID afin de renvoyer productName. Dans cette relation, le Products tableau est le parent et le tableau Détails de la commande est l’enfant. Par conséquent, lors de l’itération dans la OrderDetails table, GetParentRow est appelée pour récupérer la valeur associée ProductName .
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 vrai). Cela suppose que toutes les lignes de la Orders table ont une CustomerID valeur qui existe dans la table parente Customers . S'il existe un CustomerID dans la table Orders qui n'existe pas dans la table Customers, cela provoque une ForeignKeyConstraint exception.
Lorsque la colonne enfant peut contenir des valeurs que la colonne parente ne contient pas, définissez le drapeau createConstraints sur false lors de l’ajout de la DataRelation. Dans l’exemple, l’indicateur createConstraints est défini false pour la DataRelation entre la Orders table et la OrderDetails table. Cela permet à l’application de retourner tous les enregistrements de la OrderDetails table et uniquement un sous-ensemble d’enregistrements de la Orders table sans générer d’exception d’exécution. L’exemple développé génère une sortie au format suivant.
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 élargi où les valeurs des tables OrderDetails et Products sont renvoyées, avec uniquement un sous-ensemble des enregistrements de la table Orders retourné.
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