Навигация по отношениям DataRelation
Одно из основных назначений объекта DataRelation состоит в обеспечении переходов от одного объекта DataTable к другому в пределах DataSet. Это позволяет извлекать все связанные DataRow объекты в одном объекте DataTable при указании одного объекта DataRow из связанной dataTable. Например, после установки DataRelation между таблицей клиентов и таблицей заказов можно получить все строки заказа для определенной строки клиента с помощью GetChildRows.
В следующем примере кода создается dataRelation между таблицей Customers и таблицей Orders набора данных и возвращаются все заказы для каждого клиента.
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
Следующий пример основан на предыдущем примере; в нем четыре таблицы связываются друг с другом и происходит переход по этим связям. Как и в предыдущем примере, CustomerID связывает таблицу Customers с таблицей Orders . Для каждого клиента в таблице "Клиенты" определяются все дочерние строки в таблице "Заказы ", чтобы возвращать количество заказов, которое имеет конкретный клиент, и их значения OrderID .
Развернутый пример также возвращает значения из таблиц OrderDetails и Products . Таблица Orders связана с таблицей OrderDetails с помощью OrderID , чтобы определить, для каждого заказа клиента, какие продукты и объемы были заказаны. Так как таблица OrderDetails содержит только идентификатор ProductID заказанного продукта, OrderDetails связан с продуктами с помощью ProductID для возврата ProductName. В этом отношении таблица Products является родительским, а таблица "Сведения о заказе" является дочерним. В результате при итерации по таблице OrderDetails вызывается Метод GetParentRow, чтобы получить связанное значение ProductName.
Обратите внимание, что при создании DataRelation для таблиц "Клиенты и заказы " для флага createConstraints (значение по умолчанию равно true). Предполагается, что все строки в таблице Orders имеют значение CustomerID , существующее в родительской таблице Customers . Если CustomerID существует в таблице "Заказы", которая не существует в таблице "Клиенты", ForeignKeyConstraint возникает исключение.
Если дочерний столбец может содержать значения, которые родительский столбец не содержит, задайте для флага createConstraints значение false при добавлении DataRelation. В примере флаг createConstraints имеет значение false для dataRelation между таблицей Orders и таблицей OrderDetails . Это позволяет приложению возвращать все записи из таблицы OrderDetails и только подмножество записей из таблицы Orders без создания исключения во время выполнения. В этом расширенном образце вывод формируется в следующем формате.
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
Следующий пример кода — это развернутый пример, в котором возвращаются значения из таблиц OrderDetails и Products , при этом возвращается только подмножество записей в возвращаемой таблице 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