DataRelationの主な機能の 1 つは、DataSet内の 1 つのDataTableから別のへのナビゲーションを許可することです。 これにより、1 つの DataTable から 1 つの DataRow を指定したときに、1 つの DataTable 内のすべての関連するDataRow オブジェクトを取得できます。 たとえば、顧客のテーブルと注文テーブルの間に DataRelation を確立した後、 GetChildRows を使用して特定の顧客行のすべての注文行を取得できます。
次のコード例では、DataSet の Customers テーブルと Orders テーブルの間に 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
次の例は、前の例に基づいて作成され、4 つのテーブルを関連付け、それらのリレーションシップ間を移動します。 前の例と同様に、 CustomerID は Customers テーブルを Orders テーブルに関連付けます。 Customers テーブル内の各顧客について、特定の顧客が持っている注文の数とその OrderID 値を返すために、Orders テーブル内のすべての子行が決定されます。
展開された例では、 OrderDetails テーブルと Products テーブルの値も返されます。 Orders テーブルは、OrderID を使用して OrderDetails テーブルに関連し、各顧客注文について、注文された製品と数量を決定します。 OrderDetails テーブルには注文された製品の ProductID のみが含まれているため、OrderDetails は ProductName を返すために ProductIDを使用する製品に関連付けられます。 この関係では、 Products テーブルは親であり、 Order Details テーブルは子です。 その結果、OrderDetails テーブルを反復処理するときに、関連する ProductName 値を取得するために GetParentRow が呼び出されます。
Customers テーブルと Orders テーブルに対して DataRelation が作成されるとき、createConstraints フラグに値が指定されていないことに注意してください (既定値は true です)。 これは、Orders テーブルのすべての行に、親 Customers テーブルに存在する CustomerID 値があることを前提としています。 Customers テーブルに存在しない CustomerID が Orders テーブルに存在する場合、ForeignKeyConstraintによって例外がスローされます。
子列に親列に含まれていない値が含まれている可能性がある場合は、DataRelation を追加するときに createConstraints フラグを false に設定します。 この例では、Orders テーブルと OrderDetails テーブルの間の DataRelation に対して createConstraints フラグが 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