データのリレーショナル表現では、個々のテーブルに、列または列のセットを使用して相互に関連する行が含まれます。 ADO.NET DataSetでは、テーブル間のリレーションシップは DataRelationを使用して実装されます。 DataRelation を作成すると、列の親子リレーションシップはリレーションシップによってのみ管理されます。 テーブルと列は個別のエンティティです。 XML が提供するデータの階層表現では、親子リレーションシップは入れ子になった子要素を含む親要素によって表されます。
DataSet がXmlDataDocumentと同期されたとき、または WriteXml を使用して XML データとして書き込まれるときに子オブジェクトの入れ子を容易にするために、DataRelation は入れ子になったプロパティを公開します。 DataRelation の Nested プロパティを true に設定すると、XML データとして書き込まれるか、XmlDataDocument と同期されるときに、リレーションシップの子行が親列内で入れ子になります。 既定では、DataRelation の入れ子になったプロパティは 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"]);
DataRelation オブジェクトの入れ子になったプロパティがこの DataSet に対して true に設定されていないため、この DataSet が XML データとして表される場合、子オブジェクトは親要素内に入れ子になりません。 入れ子になっていないデータ関係を持つ、関連する DataSet を含む DataSet のXML 表現を変換すると、パフォーマンスが低下する可能性があります。 データ関係を入れ子にすることをお勧めします。 これを行うには、 入れ子になった プロパティを 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 要素をそれぞれの親要素の子として表示する場合は、DataRelation の Nested プロパティを 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>