DataRelation の入れ子化 (ADO.NET)

更新 : November 2007

データのリレーショナル表現では、各テーブルに含まれている行が、列または列セットを使用して相互に関連付けられています。ADO.NET の DataSet では、テーブル間のリレーションシップは DataRelation を使用して実装されます。DataRelation を作成すると、親子の列のリレーションシップはこのリレーションだけをとおして管理されます。テーブルと列はそれぞれ別個のエンティティです。XML のデータ階層表現では、子要素が入れ子の状態で含まれている親要素によって親子のリレーションシップが表現されます。

子オブジェクトの入れ子を実現するため、DataSetXmlDataDocument と同期されるか、または WriteXml を使用して XML データとして書き込まれるときに、DataRelationNested プロパティを公開します。DataRelationNested プロパティを true に設定すると、XML データとして書き込まれるとき、または XmlDataDocument と同期されるときに、このリレーションにおける子の行が親の列の中で入れ子になります。DataRelationNested プロパティは既定では false に設定されています。

たとえば、次のような DataSet があるとします。

' Assumes connection is a valid SqlConnection.
Dim customerAdapter As SqlDataAdapter = New SqlDataAdapter( _
  "SELECT CustomerID, CompanyName FROM Customers", connection)
Dim orderAdapter As SqlDataAdapter = New SqlDataAdapter( _
  "SELECT OrderID, CustomerID, OrderDate FROM Orders", connection)

connection.Open()

Dim dataSet As DataSet = New DataSet("CustomerOrders")
customerAdapter.Fill(dataSet, "Customers")
orderAdapter.Fill(dataSet, "Orders")

connection.Close()

Dim customerOrders As DataRelation = dataSet.Relations.Add( _
  "CustOrders", dataSet.Tables("Customers").Columns("CustomerID"), _
  dataSet.Tables("Orders").Columns("CustomerID"))
// Assumes connection is a valid SqlConnection.
SqlDataAdapter customerAdapter = new SqlDataAdapter(
  "SELECT CustomerID, CompanyName FROM Customers", connection);
SqlDataAdapter orderAdapter = new SqlDataAdapter(
  "SELECT OrderID, CustomerID, OrderDate FROM Orders", connection);

connection.Open();

DataSet dataSet = new DataSet("CustomerOrders");
customerAdapter.Fill(dataSet, "Customers");
orderAdapter.Fill(dataSet, "Orders");

connection.Close();

DataRelation customerOrders = dataSet.Relations.Add(
  "CustOrders", dataSet.Tables["Customers"].Columns["CustomerID"],
  dataSet.Tables["Orders"].Columns["CustomerID"]);

この DataSet では DataRelation オブジェクトの Nested プロパティが true に設定されていないため、DataSet が XML データとして表されるときに、子オブジェクトは親要素の中で入れ子になりません。関連する DataSet を含んだ DataSet の XML 表現を変換するとき、データ リレーションが入れ子になっていないと、パフォーマンスが低下する場合があります。データ リレーションシップは入れ子にすることをお勧めします。入れ子にするには、Nested プロパティを true に設定します。次に、トップダウン階層形式の XPath クエリ式を使用してデータを検索、変換するコードを XSLT スタイル シートに記述します。

DataSet に対して WriteXml を呼び出した結果を次のコード サンプルに示します。

<CustomerOrders>
  <Customers>
    <CustomerID>ALFKI</CustomerID>
    <CompanyName>Alfreds Futterkiste</CompanyName>
  </Customers>
  <Customers>
    <CustomerID>ANATR</CustomerID>
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>
  </Customers>
  <Orders>
    <OrderID>10643</OrderID>
    <CustomerID>ALFKI</CustomerID>
    <OrderDate>1997-08-25T00:00:00</OrderDate>
  </Orders>
  <Orders>
    <OrderID>10692</OrderID>
    <CustomerID>ALFKI</CustomerID>
    <OrderDate>1997-10-03T00:00:00</OrderDate>
  </Orders>
  <Orders>
    <OrderID>10308</OrderID>
    <CustomerID>ANATR</CustomerID>
    <OrderDate>1996-09-18T00:00:00</OrderDate>
  </Orders>
</CustomerOrders>

Customers 要素と Orders 要素が兄弟要素として示されています。Orders 要素を該当する親要素の子として表すには、DataRelationNested プロパティを true に設定し、次のコードを追加する必要があります。

customerOrders.Nested = True
customerOrders.Nested = true;

上記のコードを追加した結果の出力を次のコードに示します。この例では、Orders 要素がそれぞれ該当する親要素の中で入れ子になっています。

<CustomerOrders>
  <Customers>
    <CustomerID>ALFKI</CustomerID>
    <Orders>
      <OrderID>10643</OrderID>
      <CustomerID>ALFKI</CustomerID>
      <OrderDate>1997-08-25T00:00:00</OrderDate>
    </Orders>
    <Orders>
      <OrderID>10692</OrderID>
      <CustomerID>ALFKI</CustomerID>
      <OrderDate>1997-10-03T00:00:00</OrderDate>
    </Orders>
    <CompanyName>Alfreds Futterkiste</CompanyName>
  </Customers>
  <Customers>
    <CustomerID>ANATR</CustomerID>
    <Orders>
      <OrderID>10308</OrderID>
      <CustomerID>ANATR</CustomerID>
      <OrderDate>1996-09-18T00:00:00</OrderDate>
    </Orders>
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>
  </Customers>
</CustomerOrders>

参照

概念

DataRelation の追加 (ADO.NET)

その他の技術情報

DataSet での XML の使用 (ADO.NET)

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