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 内のフィールドの序数位置は、Recordset のスキーマ定義を調べることで取得できます。 すべてのフィールドには、そのフィールドの序数を含む Recordset スキーマ名前空間で定義された OLE DB プロパティ rs:number があります。
子 Recordset 内のすべてのフィールドの名前は、この子を含む親 Recordset 内のフィールドの名前と連結されます。 これは、親と子の Recordset の両方に、2 つの異なるテーブルから取得されたものの、単一の名前が付けられたフィールドが含まれている場合に、名前の競合が確実に発生しないようにするためです。
階層 Recordset を XML に保存する場合は、ADO で次の制限事項に注意する必要があります。
更新が保留中の階層 Recordset を XML に永続化することはできません。
パラメーター化された shape コマンドを使用して作成された階層 Recordset は、(XML または ADTG 形式で) 永続化できません。
ADO では現在、親と子の Recordset の間のリレーションシップをバイナリ ラージ オブジェクト (BLOB) として保存しています。 このリレーションシップを記述する XML タグは、行セット スキーマ名前空間でまだ定義されていません。
階層 Recordset を保存すると、すべての子 Recordset が一緒に保存されます。 現在の Recordset が別の Recordset の子である場合、その親は保存されません。 現在の Recordset のサブツリーを形成するすべての子 Recordset が保存されます。
階層 Recordset をその XML で永続化された形式から再度開く場合は、次の制限事項に注意する必要があります。
子レコードに、対応する親レコードがないレコードが含まれている場合、これらの行は階層 Recordset の XML 表現では書き出されません。 したがって、Recordset を永続化された場所から再度開くと、これらの行は失われます。
子レコードに複数の親レコードへの参照がある場合、Recordset を再度開くと、子 Recordset に重複レコードが含まれる可能性があります。 しかし、これらの重複は、ユーザーが基になる子行セットを直接操作する場合にのみ表示されます。 チャプターを使用して子 Recordset 内を移動する場合 (ADO 内を移動する唯一の方法)、重複は表示されません。