Adatkapcsolatok navigálása
Az egyik elsődleges függvény DataRelation az, hogy lehetővé tegye a navigációt az egyikről DataTable a másikra egy DataSet. Ez lehetővé teszi az összes kapcsolódó DataRow objektum lekérését egy DataTable-ban , ha egyetlen DataRow-t ad meg egy kapcsolódó DataTable-ból. Miután például létrehoz egy DataRelation értéket egy ügyféltábla és egy rendelési tábla között, lekérheti egy adott ügyfélsor összes rendelési sorát a GetChildRows használatával.
Az alábbi példakód létrehoz egy DataRelation értéket az Ügyfelek tábla és az Adatkészlet Rendelések táblája között, és minden egyes ügyfél rendelését visszaadja.
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
A következő példa az előző példára épül, amely négy táblát mutat össze, és ezeket a kapcsolatokat navigálja. Az előző példához hasonlóan a CustomerID a Vevők táblát a Rendelések táblához kapcsolja. A Vevők tábla minden egyes ügyfele esetében a Rendelések tábla összes gyermeksorát meghatározza a rendszer annak érdekében, hogy visszaadja az adott ügyfél rendeléseinek számát és rendelésazonosító-értékeit.
A kibontott példa az OrderDetails és a Products táblák értékeit is visszaadja. A Rendelések tábla az OrderDetails táblához kapcsolódik az OrderID használatával annak meghatározásához, hogy az egyes vevői rendelésekhez milyen termékeket és mennyiségeket rendeltek. Mivel az OrderDetails tábla csak egy megrendelt termék termékazonosítóját tartalmazza, az OrderDetails a ProductID-t használó termékekhez kapcsolódik a ProductName visszaadásához. Ebben a kapcsolatban a Termékek tábla a szülő, a Rendelés részletei tábla pedig a gyermek. Ennek eredményeképpen az OrderDetails táblán keresztüli iteráláskor a GetParentRow meghívást kap a kapcsolódó ProductName érték lekérésére.
Figyelje meg, hogy amikor létrejön a DataRelation a Vevők és rendelések táblákhoz, nincs megadva érték a createConstraints jelölőhöz (az alapértelmezett érték igaz). Ez azt feltételezi, hogy a Rendelések tábla összes sora rendelkezik ügyfélazonosító értékkel, amely a szülő Vevők táblában található. Ha a Rendelések táblában olyan Ügyfélazonosító található, amely nem szerepel a Vevők táblában, ForeignKeyConstraint kivétel keletkezik.
Ha a gyermekoszlop olyan értékeket tartalmazhat, amelyeket a szülőoszlop nem tartalmaz, állítsa a createConstraints jelölőt hamisra a DataRelation hozzáadásakor. A példában a createConstraints jelölő hamis értékre van állítva az Orders tábla és az OrderDetails tábla közötti DataRelation esetében. Ez lehetővé teszi, hogy az alkalmazás az OrderDetails tábla összes rekordját és csak a rekordok egy részhalmazát adja vissza a Rendelések táblából anélkül, hogy futásidejű kivételt hozna létre. A kibontott minta a következő formátumban hozza létre a kimenetet.
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
Az alábbi példakód egy kibontott minta, amelyben az OrderDetails és a Products tábla értékei jelennek meg, és csak a Rendelések tábla rekordjainak egy részhalmaza lesz visszaadva.
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