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;"
以下是儲存之 Recordset 的 XML 格式:
<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 中字段的序數位置。 每個欄位都有 OLE DB 屬性 rs:number,定義於 Recordset 架構命名空間中,其中包含該欄位的序數位。
子集合中的所有欄位名稱都會與包含該子集合的父集合中的欄位名稱串聯。 這是為了確保在父和子 Recordsets 都包含來自兩個不同數據表但以相同名稱命名的欄位時,不會發生名稱衝突。
將階層式 Recordets 儲存至 XML 時,您應該注意 ADO 中的下列限制:
具有暫止更新的階層式 Recordset 無法儲存至 XML。
使用參數化圖形命令建立的階層式 Recordset 無法保存(XML 或 ADTG 格式)。
ADO 目前會將父系和子 Recordsets 之間的關聯性儲存為二進位大型物件 (BLOB)。 描述此關聯性的 XML 標籤尚未在資料列集架構命名空間中定義。
當儲存階層結構的記錄集時,所有子記錄集會與其一同儲存。 如果目前的 Recordset 是另一個 Recordset 的子系,則不會儲存其父系。 組成當前 Recordset 子樹的所有子 Recordset 都會被儲存。
當層級性記錄集從 XML 儲存的格式重新開啟時,您必須注意下列限制:
如果子記錄包含沒有對應父記錄的記錄,則這些數據列不會以階層式 Recordset 的 XML 表示法寫出。 因此,當 Recordset 從其保存位置重新開啟時,這些數據列將會遺失。
如果子記錄具有多個父記錄的參考,則在重新開啟 Recordset 時,子 Recordset 可能包含重複的記錄。 不過,只有在使用者直接使用基礎資料列集時,才會顯示這些重複項目。 如果使用章節來巡覽子 Recordset(這是透過 ADO 瀏覽的唯一方式),重複項目不可見。