Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een van de primaire functies van een DataRelation is het toestaan van navigatie van het ene DataTable naar het andere binnen een DataSet. Hiermee kunt u alle gerelateerde DataRow objecten in één DataTable object ophalen wanneer u één DataRow object uit een gerelateerde gegevenstabel krijgt. Nadat u bijvoorbeeld een DataRelation tussen een tabel met klanten en een tabel met orders hebt gemaakt, kunt u alle orderrijen voor een bepaalde klantrij ophalen met GetChildRows.
In het volgende codevoorbeeld wordt een DataRelation tussen de Customers tabel en de Orders tabel van een DataSet gemaakt en worden alle orders voor elke klant geretourneerd.
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
Het volgende voorbeeld is gebaseerd op het voorgaande voorbeeld, waarbij vier tabellen aan elkaar zijn gekoppeld en door deze relaties worden ge navigeerd. Net als in het vorige voorbeeld is CustomerID de Customers tabel gekoppeld aan de Orders tabel. Voor elke klant in de Customers-tabel worden alle onderliggende rijen in de Orders-tabel bepaald om het aantal bestellingen dat een specifieke klant heeft te berekenen en de bijbehorende OrderID-waarden te verkrijgen.
Het uitgebreide voorbeeld retourneert ook de waarden uit de OrderDetails en Products tabellen. De Orders tabel is gerelateerd aan de OrderDetails tabel om met behulp van OrderID te bepalen welke producten en hoeveelheden voor iedere klantenorder werden besteld. Omdat de OrderDetails tabel alleen het ProductID bestelde product bevat, OrderDetails is gerelateerd aan Products het gebruik ProductID om de ProductName te retourneren. In deze relatie is de Products tabel de boventabel en de tabel Ordergegevens de onderliggende tabel. Als gevolg hiervan wordt bij het doorlopen van de OrderDetails-tabel GetParentRow opgeroepen om de bijbehorende ProductName-waarde op te halen.
Merk op dat wanneer de DataRelation wordt aangemaakt voor de Customers- en Orders-tabellen, er geen waarde is opgegeven voor de createConstraints-vlag (de standaardwaarde is waar). Hierbij wordt ervan uitgegaan dat alle rijen in de Orders tabel een CustomerID waarde hebben die bestaat in de bovenliggende Customers tabel. Als er een CustomerID bestaat in de Orders tabel die niet in de Customers tabel bestaat, wordt er een ForeignKeyConstraint uitzondering gegenereerd.
Wanneer de kindkolom mogelijk waarden bevat die de ouderkolom niet bevat, stelt u de createConstraints vlag in op false bij het toevoegen van de DataRelation. In het voorbeeld wordt de createConstraints-indicator ingesteld op false voor de DataRelation tussen de Orders-tabel en de OrderDetails-tabel. Hierdoor kan de toepassing alle records uit de OrderDetails tabel en slechts een subset records uit de Orders tabel retourneren zonder een runtime-uitzondering te genereren. Het uitgebreide voorbeeld genereert uitvoer in de volgende indeling.
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
Het volgende codevoorbeeld is een uitgebreid voorbeeld waarin de waarden uit de OrderDetails en Products tabellen worden geretourneerd, waarbij alleen een subset van de records in de Orders tabel wordt geretourneerd.
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