次の方法で共有


DataRelation の移動 (ADO.NET)

DataRelation の主な機能の 1 つは、DataSet の 1 つの DataTable から別の DataTable を移動できることです。 この参照により、関連付けられた DataTable から単一の DataRow を指定すると、1 つの DataTable 内の関連する DataRow オブジェクトをすべて取得できます。 たとえば、顧客のテーブルとオーダーのテーブル間に DataRelation を確立すると、GetChildRows を使用して特定の顧客行のオーダー行をすべて取得できます。

DataSetCustomers テーブルと Orders テーブル間の DataRelation を作成し、各顧客のすべてのオーダーを返すコード サンプルを次に示します。

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
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());
    }
}

上記の例に基づいて、4 つのテーブルを相互に関連付け、そのテーブルのリレーションシップ間を移動する例を次に示します。 上記の例に示すように、CustomerIDCustomers テーブルを Orders テーブルに関連付けます。 Customers テーブルにある各顧客に対しては、Orders テーブルにあるすべての子の行が確定され、該当する顧客のオーダー数とその OrderID の値が返されます。

展開された例では、OrderDetails テーブルおよび Products テーブルからも値が返されます。 各顧客のオーダーに対しては、オーダーされた製品および数量を示すために、OrderID を使用して Orders テーブルが OrderDetails テーブルに関連付けられます。 OrderDetails テーブルに含まれているのは、オーダーされた製品の ProductID だけであるため、ProductID を使用して、OrderDetailsProducts に関連付けて ProductName を返します。 このリレーションでは、Products テーブルが親となり、Order Details テーブルが子となります。 その結果、OrderDetails テーブルを順次処理すると、GetParentRow が呼び出され、関連付けられた ProductName の値を取得します。

DataRelationCustomers テーブルと Orders テーブルに対して作成された場合には、createConstraints フラグには値が指定されません (既定値は true)。 これは、Orders テーブルにあるすべての行に対して親の Customers テーブルにある CustomerID の値が設定されているためです。 Orders テーブルに、Customers テーブルに存在しない CustomerID が存在する場合、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

Orders テーブルのレコードのサブセットだけと共に、OrderDetails テーブルと Products テーブルからの値が返された場合に展開された例を次のコード サンプルに示します。

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
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"]);
        }
    }
}

参照

その他の技術情報

DataSets、DataTables、および DataViews (ADO.NET)