次の方法で共有


DataRelation の入れ子化

データのリレーショナル表現では、個々のテーブルに、列または列のセットを使用して相互に関連する行が含まれます。 ADO.NET DataSetでは、テーブル間のリレーションシップは DataRelationを使用して実装されます。 DataRelation を作成すると、列の親子リレーションシップはリレーションシップによってのみ管理されます。 テーブルと列は個別のエンティティです。 XML が提供するデータの階層表現では、親子リレーションシップは入れ子になった子要素を含む親要素によって表されます。

DataSetXmlDataDocumentと同期されたとき、または WriteXml を使用して XML データとして書き込まれるときに子オブジェクトの入れ子を容易にするために、DataRelationNestedプロパティを公開します。 NestedDataRelation プロパティを true に設定すると、XmlDataDocument と同期される場合や XML データとして書き込まれる場合に、リレーションの子行が親列内に入れ子になります。 既定では、NestedDataRelation プロパティは 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"]);

Nested オブジェクトのDataRelationプロパティが、このDataSetに対してtrueに設定されていないため、このDataSetがXMLデータとして表現される際に、子オブジェクトは親要素内に入れ子になりません。 入れ子になっていないデータ関係を持つ、関連する DataSetを含むの XML 表現を変換すると、パフォーマンスが低下する可能性があります。 データ リレーションシップは入れ子にすることをお勧めします。 これを行うには、 Nested プロパティを true に設定 します。 次に、トップダウンの階層型 XPath クエリ式を使用してデータを見つけて変換するコードを XSLT スタイル シートに記述します。

次のコード例は、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要素をそれぞれの親要素の子として表示する場合は、NestedDataRelation プロパティを 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>

こちらも参照ください