在關係型資料表示中,個別資料表中的行使用一列或多列相互關聯。 在 ADO.NET DataSet中,會使用 DataRelation實作數據表之間的關聯性。 當您建立 DataRelation 時,數據行的父子關聯性只會透過關聯來管理。 數據表和數據行是個別的實體。 在 XML 提供之數據的階層式表示中,父子關聯性是由包含巢狀子元素的父元素表示。
為了方便當 DataSet 與 XmlDataDocument 同步或使用 WriteXml 以 XML 資料形式編寫子物件的巢狀,DataRelation 會公開一個 Nested 屬性。 將 Nested 的屬性設為 true 時,這會導致關係的子列在以 XML 資料寫入或與 XmlDataDocument 同步時被巢狀在父欄位中。
Nested的性質DataRelation預設為假。
例如,請考慮下列 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的Nested屬性未設定為true,當其以 XML 資料表示時,子物件不會巢狀於父元素中。 將描述包含相關資料集且非巢狀資料關係之DataSet轉換,可能導致效能降低。 建議您嵌套數據關係。 要做到這點,請將屬性 Nested 設 為 true。 然後在 XSLT 樣式表單中撰寫程式代碼,以使用由上而下階層式 XPath 查詢表示式來尋找和轉換數據。
以下程式碼範例展示了呼叫 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>