巢狀 DataRelation

關聯式資料表示中,個別資料表所包含的資料列使用一個或一組資料行彼此相關。 在 ADO.NET DataSet 中,是使用 DataRelation 來實作資料表間的關聯性。 當您建立 DataRelation 時,資料行的父子關係只透過這項關聯來管理。 而資料表和資料行是個別的實體。 XML 提供的階層式資料表示中,父子關係是由包含巢狀項目子系的父項目表示。

DataSetXmlDataDocument 同步處理時,或使用 WriteXml 撰寫為 XML,若要加速子物件的巢狀,DataRelation 會公開 Nested 屬性。 將 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"]);  

由於在這個 DataSetDataRelation 物件的 Nested 屬性並未設定為 true ,所以將這個 DataSet 表示為 XML 資料時,子物件不會巢狀化至父項目。 使用非巢狀資料關聯來轉換包含相關 DataSetDataSet XML 表示可能會導致效能降低。 因此,我們建議您巢狀化資料關聯。 若要這樣做,請將 Nested 屬性設定為 true。 然後,在 XSLT 樣式表中寫入程式碼,以便使用由上而下階層式 XPath 查詢運算式來找出並轉換資料。

下列程式碼範例演示了在 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>  

另請參閱