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 的唯一方式),則不會顯示重複項目。