Navigace v datových relacích
Jednou z primárních funkcí a DataRelation je povolit navigaci mezi sebou DataTable v rámci DataSet. To vám umožní načíst všechny související DataRow objekty v jedné DataTable při zadání jednoho DataRow ze související DataTable. Například po vytvoření datové relace mezi tabulkou zákazníků a tabulkou objednávek můžete načíst všechny řádky objednávek pro konkrétní řádek zákazníka pomocí GetChildRows.
Následující příklad kódu vytvoří DataRelation mezi tabulka Customers a Orders tabulky DataSet a vrátí všechny objednávky pro každého zákazníka.
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
Další příklad vychází z předchozího příkladu, který spojuje čtyři tabulky a přecházá mezi těmito relacemi. Stejně jako v předchozím příkladu se ID zákazníka vztahuje k tabulce Zákazníci s tabulkou Objednávky . Pro každého zákazníka v tabulce Zákazníci se určí všechny podřízené řádky v tabulce Objednávky , aby bylo možné vrátit počet objednávek, které má konkrétní zákazník, a jejich hodnoty ORDERID .
Rozbalený příklad také vrátí hodnoty z tabulek OrderDetails a Products . Tabulka Objednávky souvisí s tabulkou OrderDetails pomocí OrderID k určení, pro každou objednávku zákazníka, jaké produkty a množství byly objednány. Vzhledem k tomu, že tabulka OrderDetails obsahuje pouze IDProduktu objednaného produktu, vztahuje se OrderDetails k produktům používajícím IDproduktu, aby bylo možné produkt vrátit. V tomto vztahu je tabulka Products nadřazenou položkou a tabulka Podrobnosti objednávky je podřízená. Výsledkem je, že při iterování prostřednictvím tabulky OrderDetails se volá GetParentRow pro načtení související hodnoty ProductName .
Všimněte si, že při vytvoření DataRelation pro tabulky Customers and Orders není zadána žádná hodnota příznaku createConstraints (výchozí hodnota je true). Předpokládá se, že všechny řádky v tabulce Objednávky mají hodnotu CustomerID , která existuje v nadřazené tabulce Zákazníci . Pokud v tabulce Objednávky existuje ID zákazníka, které v tabulce Zákazníci neexistuje, ForeignKeyConstraint vyvolá se výjimka.
Pokud podřízený sloupec může obsahovat hodnoty, které nadřazený sloupec neobsahuje, nastavte příznak createConstraints na false při přidávání dataRelation. V příkladu je příznak createConstraints nastaven na false pro DataRelation mezi tabulka Orders a OrderDetails tabulka. Aplikace tak může vrátit všechny záznamy z tabulky OrderDetails a pouze podmnožinu záznamů z tabulky Orders bez generování výjimky za běhu. Rozšířená ukázka generuje výstup v následujícím formátu.
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
Následující příklad kódu je rozšířená ukázka, kde jsou vráceny hodnoty z tabulek OrderDetails a Products , přičemž se vrací pouze podmnožina záznamů v tabulce Orders .
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