Nawigowanie w elementach DataRelation
Jedną z podstawowych funkcji elementu DataRelation jest zezwolenie na nawigację między sobą DataTable w obiekcie DataSet. Umożliwia to pobranie wszystkich powiązanych DataRow obiektów w jednej tabeli DataTable w przypadku pojedynczego elementu DataRow z powiązanej tabeli DataTable. Na przykład po ustanowieniu elementu DataRelation między tabelą klientów i tabelą zamówień można pobrać wszystkie wiersze zamówienia dla określonego wiersza klienta przy użyciu polecenia GetChildRows.
Poniższy przykład kodu tworzy tabelę DataRelation między tabelą Customers a tabelą Orders (Zamówienia) zestawu danych i zwraca wszystkie zamówienia dla każdego klienta.
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
Następny przykład opiera się na poprzednim przykładzie, odnoszącym się do czterech tabel razem i nawigowaniu po tych relacjach. Podobnie jak w poprzednim przykładzie, CustomerID wiąże tabelę Customers z tabelą Orders (Zamówienia). Dla każdego klienta w tabeli Customers są określane wszystkie wiersze podrzędne w tabeli Orders (Zamówienia), aby zwrócić liczbę zamówień określonego klienta i ich wartości OrderID .
Rozszerzony przykład zwraca również wartości z tabel OrderDetails i Products . Tabela Orders (Zamówienia) jest powiązana z tabelą OrderDetails przy użyciu identyfikatora OrderID , aby określić, jakie produkty i ilości zostały zamówione dla każdego zamówienia klienta. Ponieważ tabela OrderDetails zawiera tylko identyfikator ProductID uporządkowanego produktu, orderDetails jest powiązany z produktami używającymi identyfikatora ProductID w celu zwrócenia nazwy produktu. W tej relacji tabela Products jest elementem nadrzędnym, a tabela Order Details jest elementem podrzędnym. W związku z tym podczas iteracji za pośrednictwem tabeli OrderDetails wywoływana jest funkcja GetParentRow w celu pobrania powiązanej wartości ProductName.
Zwróć uwagę, że po utworzeniu tabeli DataRelation dla tabel Customers and Orders żadna wartość nie jest określona dla flagi createConstraints (wartość domyślna to true). Przyjęto założenie, że wszystkie wiersze w tabeli Zamówienia mają wartość CustomerID, która istnieje w nadrzędnej tabeli Customers. Jeśli w tabeli Orders (Zamówienia) istnieje identyfikator CustomerID, który nie istnieje w tabeli Customers (Klienci), zgłaszany ForeignKeyConstraint jest wyjątek.
Jeśli kolumna podrzędna może zawierać wartości, których kolumna nadrzędna nie zawiera, ustaw flagę createConstraints na false podczas dodawania elementu DataRelation. W tym przykładzie flaga createConstraints jest ustawiona na wartość false dla tabeli Orders i tabeli OrderDetails. Dzięki temu aplikacja zwraca wszystkie rekordy z tabeli OrderDetails i tylko podzestaw rekordów z tabeli Orders bez generowania wyjątku czasu wykonywania. Rozwinięty przykład generuje dane wyjściowe w następującym formacie.
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
Poniższy przykład kodu to rozwinięty przykład, w którym zwracane są wartości z tabel OrderDetails i Products , z tylko podzbiorem rekordów w zwracanej tabeli 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