一个DataRelation的主要功能之一是允许在DataTable中从一个DataSet导航到另一个DataSet。 这样,就可以在给定相关 DataRow 中的单个 DataRow 时检索一个 DataTable 中的所有相关对象。 例如,在客户表和订单表之间建立 DataRelation 后,可以使用 GetChildRows 检索特定客户行的所有订单行。
下面的代码示例在 DataSet 的“客户”表和“订单”表之间创建 DataRelation,并返回每个客户的所有订单。
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 表仅包含已订购产品的 产品ID,所以要通过 产品ID 使 OrderDetails 与 产品 关联,从而返回 产品名称。 在此关系中, Products 表是父表, “订单详细信息 ”表是子表。 因此,在循环访问 OrderDetails 表时,调用 GetParentRow 以检索相关的 ProductName 值。
请注意,为“客户”和“订单”表创建 DataRelation 时,不会为 createConstraints 标志指定任何值(默认值为 true)。 这假定 Orders 表中的所有行都有一个 CustomerID 值,该值存在于父 Customers 表中。 如果 CustomerID 存在于 “订单” 表中而在 “客户” 表中不存在,则 ForeignKeyConstraint 会导致引发异常。
如果子列可能包含父列不包含的值,请在添加 DataRelation 时将 createConstraints 标志设置为 false。 在此示例中,CreateConstraints 标志对于 Orders 表和 OrderDetails 表之间的 DataRelation 设置为 false。 这使应用程序能够返回 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