共用方式為


XML 中的階層式資料錄集

ADO 允許將階層式 Recordset 物件保存至 XML。 使用階層式 Recordset 物件時,父 Recordset 中的欄位值是另一個 Recordset。 這類欄位會以 XML 資料流中的子項目表示,而不是屬性。

備註

示範此案例的範例如下:

Rs.Open "SHAPE {select stor_id, stor_name, state from stores} APPEND ({select stor_id, ord_num, ord_date, qty from sales} AS rsSales RELATE stor_id TO stor_id)", "Provider=MSDataShape;DSN=pubs;Integrated Security=SSPI;"  

以下是 XML 格式的已保存 Recordset:

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"     xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"     xmlns:rs="urn:schemas-microsoft-com:rowset"   
    xmlns:z="#RowsetSchema">   
  <s:Schema id="RowsetSchema">   
    <s:ElementType name="row" content="eltOnly" rs:updatable="true">   
      <s:AttributeType name="stor_id" rs:number="1"   
        rs:writeunknown="true">   
        <s:datatype dt:type="string" dt:maxLength="4"   
          rs:fixedlength="true" rs:maybenull="false"/>   
      </s:AttributeType>   
      <s:AttributeType name="stor_name" rs:number="2" rs:nullable="true"   
        rs:writeunknown="true">   
          <s:datatype dt:type="string" dt:maxLength="40"/>   
      </s:AttributeType>   
      <s:AttributeType name="state" rs:number="3" rs:nullable="true"   
        rs:writeunknown="true">   
        <s:datatype dt:type="string" dt:maxLength="2"   
          rs:fixedlength="true"/>   
      </s:AttributeType>   
      <s:ElementType name="rsSales" content="eltOnly"   
        rs:updatable="true" rs:relation="010000000100000000000000">   
        <s:AttributeType name="stor_id" rs:number="1"   
          rs:writeunknown="true">   
          <s:datatype dt:type="string" dt:maxLength="4"   
            rs:fixedlength="true" rs:maybenull="false"/>   
        </s:AttributeType>   
        <s:AttributeType name="ord_num" rs:number="2"   
          rs:writeunknown="true">   
          <s:datatype dt:type="string" dt:maxLength="20"   
            rs:maybenull="false"/>   
        </s:AttributeType>   
        <s:AttributeType name="ord_date" rs:number="3"   
          rs:writeunknown="true">   
            <s:datatype dt:type="dateTime" dt:maxLength="16"   
              rs:scale="3" rs:precision="23" rs:fixedlength="true"   
              rs:maybenull="false"/>   
        </s:AttributeType>   
        <s:AttributeType name="qty" rs:number="4" rs:writeunknown="true">   
          <s:datatype dt:type="i2" dt:maxLength="2" rs:precision="5"   
            rs:fixedlength="true" rs:maybenull="false"/>   
        </s:AttributeType>   
        <s:extends type="rs:rowbase"/>   
      </s:ElementType>   
      <s:extends type="rs:rowbase"/>   
    </s:ElementType>   
  </s:Schema>   
  <rs:data>   
    <z:row stor_id="6380" stor_name="Eric the Read Books" state="WA">   
      <rsSales stor_id="6380" ord_num="6871"   
        ord_date="1994-09-14T00:00:00" qty="5"/>   
      <rsSales stor_id="6380" ord_num="722a"   
        ord_date="1994-09-13T00:00:00" qty="3"/>   
    </z:row>   
    <z:row stor_id="7066" stor_name="Barnum's" state="CA">   
      <rsSales stor_id="7066" ord_num="A2976"   
        ord_date="1993-05-24T00:00:00" qty="50"/>   
      <rsSales stor_id="7066" ord_num="QA7442.3"   
        ord_date="1994-09-13T00:00:00" qty="75"/>   
    </z:row>   
    <z:row stor_id="7067" stor_name="News & Brews" state="CA">   
      <rsSales stor_id="7067" ord_num="D4482"   
        ord_date="1994-09-14T00:00:00" qty="10"/>   
      <rsSales stor_id="7067" ord_num="P2121"   
        ord_date="1992-06-15T00:00:00" qty="40"/>   
      <rsSales stor_id="7067" ord_num="P2121"   
        ord_date="1992-06-15T00:00:00" qty="20"/>   
      <rsSales stor_id="7067" ord_num="P2121"   
        ord_date="1992-06-15T00:00:00" qty="20"/>   
    </z:row>   
  </rs:data>   
</xml>   

以這種方式保存時,父 Recordset 中資料行的確切順序並不明顯。 父系中的任何欄位都可能包含子 Recordset。 持續性提供者會先將所有純量資料行保存為屬性,然後將所有子 Recordset 的「資料行」保存為父資料列的子項目。 查看 Recordset 的結構描述定義,即可取得父 Recordset 中欄位的序數位置。 每個欄位都有一個 OLE DB 屬性:rs:number,定義於 Recordset 結構描述命名空間中,其中包含該欄位的序數。

子 Recordset 中所有欄位的名稱會與此子系所屬父 Recordset 中的欄位名稱串連。 當父 Recordset 和子 Recordset 包含從兩個不同資料表取得的同名欄位時,此做法可確保不會發生名稱衝突。

將階層式 Recordets 儲存到 XML 時,您應該注意 ADO 中的下列限制:

  • 具有擱置更新的階層式 Recordset 無法保存到 XML 中。

  • 使用參數化圖形命令建立的階層式 Recordset 無法保存 (XML 或 ADTG 格式)。

  • ADO 目前會將父 Recordsset 和子 Recordsset 之間的關聯性儲存為二進位大型物件 (BLOB)。 描述此關聯性的 XML 標籤尚未定義於資料列集結構描述命名空間中。

  • 儲存階層式 Recordset 時,所有子 Recordset 都會與其一起儲存。 如果目前的 Recordset 是另一個 Recordset 的子系,則不會儲存其父代。 會儲存構成目前 Recordset 樹狀子目錄的所有子 Recordset。

當階層式 Recordset 從其 XML 保存格式重新開啟時,您必須注意下列限制:

  • 如果子記錄包含沒有對應父記錄的記錄,這些資料列就不會以階層式 Recordset 的 XML 標記法寫出。 因此,當 Recordset 從其保存位置重新開啟時,這些資料列將會遺失。

  • 如果子記錄具有多個父記錄的參考,則在重新開啟 Recordset 時,子 Recordset 可能包含重複的記錄。 不過,只有在使用者直接使用基礎子資料列集時,才會看到這些重複項目。 如果使用章節來瀏覽子 Recordset (這是瀏覽 ADO 的唯一方式),則不會顯示重複項目。

另請參閱

以 XML 格式保存記錄