データのリレーショナル表現では、各テーブルに含まれている行が、列または列セットを使用して相互に関連付けられています。ADO.NET の DataSet では、テーブル間のリレーションシップは DataRelation を使用して実装されます。DataRelation を作成すると、列の親子関係はこの DataRelation だけをとおして管理されます。テーブルと列はそれぞれ別個のエンティティです。XML のデータ階層表現の親子関係では、子要素が入れ子の状態で含まれている親要素によって表現されます。子オブジェクトの入れ子を実現するため、DataSet が XmlDataDocument と同期されるか、または WriteXml を使用して DataSet が XML データとして書き込まれるときに、DataRelation が Nested プロパティを公開します。DataRelation の Nested プロパティを true に設定すると、XML データとして書き込まれるとき、または XmlDataDocument と同期されるときに、親子関係における子の行が親の列の中で入れ子になります。DataRelation の Nested プロパティは既定では false に設定されています。たとえば、次のような DataSet があるとします。
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;" & _
"Integrated Security=SSPI;Initial Catalog=Northwind;")
Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", nwindConn)
Dim orderDA As SqlDataAdapter = New SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate FROM Orders", nwindConn)
nwindConn.Open()
Dim custDS As DataSet = New DataSet("CustomerOrders")
custDA.Fill(custDS, "Customers")
orderDA.Fill(custDS, "Orders")
nwindConn.Close()
Dim custOrderRel As DataRelation = custDS.Relations.Add("CustOrders",
custDS.Tables("Customers").Columns("CustomerID"),
custDS.Tables("Orders").Columns("CustomerID"))
[C#]
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;" +
"Integrated Security=SSPI;Initial Catalog=Northwind;");
SqlDataAdapter custDA = new SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", nwindConn);
SqlDataAdapter orderDA = new SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate FROM Orders", nwindConn);
nwindConn.Open();
DataSet custDS = new DataSet("CustomerOrders");
custDA.Fill(custDS, "Customers");
orderDA.Fill(custDS, "Orders");
nwindConn.Close();
DataRelation custOrderRel = custDS.Relations.Add("CustOrders",
custDS.Tables["Customers"].Columns["CustomerID"],
custDS.Tables["Orders"].Columns["CustomerID"]);
この DataSet では DataRelation オブジェクトの Nested プロパティが true に設定されていないため、DataSet が XML データとして表されるときに、子オブジェクトは親要素の中で入れ子になりません。
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 に設定し、次のコードを追加する必要があります。
custOrderRel.Nested = True
[C#]
custOrderRel.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>