一个DataRelation的主要功能之一是允许在DataTable中从一个DataSet导航到另一个DataSet。 这样,当从相关DataRow中给定一个单独的DataTable对象时,您可以在一次DataRow操作中检索所有相关对象。 例如,在 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 表相关联。 对于表中的每个 Customers 客户,将确定表中的所有子行 Orders ,以返回特定客户拥有的订单数及其 OrderID 值。
展开的示例还返回来自 OrderDetails 和 Products 表的值。
Orders 表与 OrderDetails 表相关联,利用 OrderID 确定每个客户订单的产品和数量。
OrderDetails由于该表仅包含ProductID已订购的产品,OrderDetails因此与Products使用ProductID来返回 ProductName 相关。 在此关系中,表 Products 是父表,Order Details 表是子表。 因此,遍历 OrderDetails 表时,会调用 GetParentRow 以检索相关的 ProductName 值。
请注意,当为DataRelation和Customers表创建Orders时,并未为createConstraints标志指定任何值(默认值为true)。 这假定表中的所有行Orders都具有父CustomerIDCustomers表中存在的值。 如果CustomerID在Orders表中存在而在Customers表中不存在,ForeignKeyConstraint会导致引发异常。
当子列可能包含父列未包含的值时,添加 createConstraints 时,请将标志 false 设置为 。 在此示例中,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