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
下一個範例是以上述範例為基礎,將四個數據表關聯在一起,並瀏覽這些關聯性。 如前例所示,將 CustomerIDCustomers 表格與 Orders 表格相關聯。 對於表格中的 Customers 每個客戶,會確定所有子列 Orders ,以回傳該客戶的訂單數量及其 OrderID 數值。
擴充範例同時回傳來自 OrderDetails 和 Products 表格的值。 該 Orders 資料表與 OrderDetails 資料表相關,利用 OrderID 來判定每個客戶訂單所訂購的產品和數量。 由於OrderDetails表格僅包含已排序產品的ProductID,OrderDetails藉由使用Products來相關聯,以回傳ProductID。 在此關係中, Products 資料表為父資料表,訂單 細節 資料表為子資料表。 因此,當在資料 OrderDetails 表中迭代時, GetParentRow 會被呼叫以取得相關 ProductName 值。
請注意,當為 DataRelation 和 Customers 資料表建立 Orders 時,createConstraints 標誌未指定任何值(預設為真)。 這假設表格中 Orders 所有列的 CustomerID 值都存在於父 Customers 表格中。 如果CustomerID中的項目存在於資料表中,但不存在於Orders資料表中,則Customers會引發一個例外。
當子欄位可能包含父欄位不包含的值時,加入 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