適用先: Access 2013、Office 2013
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;UID=MyUserId;PWD=MyPassword;"
保存された 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 "columns" を親行の子要素として永続化します。 親 Recordset 内のフィールドの序数位置は、Recordset のスキーマ定義を調べることで取得できます。 すべてのフィールドには、そのフィールドの序数を含む Recordset スキーマ名前空間で定義された OLE DB プロパティ rs:number があります。
子 Recordset のすべてのフィールドの名前は、その子を格納する親 Recordset のフィールドの名前と連結されます。 これは、親および子 Recordset の両方に、別の 2 つのテーブルから取得した同じ名前のフィールドが含まれている場合に、名前の競合が発生しないようにするためです。
階層 Recordset を XML で保存するときは、次に挙げる ADO の制約に注意する必要があります。
保留中の更新を含む階層 Recordset は、XML で保存できません。
パラメーター化されたシェイプ コマンドで作成された階層 Recordset は、XML 形式と ADTG 形式のどちらでも保存できません。
ADO では、現在、親および子 Recordset の関係を BLOB (Binary Large Object) として保存しています。 この関係を記述するための XML タグは、行セットのスキーマ名前空間ではまだ定義されていません。
階層 Recordset が保存されるときに、すべての子 Recordset も一緒に保存されます。 現在の Recordset が別の Recordset の子である場合、その親は保存されません。 現在の Recordset のサブツリーを形成するすべての子 Recordset は保存されます。
階層 Recordset を XML 保存形式から再度開くときは、次の制限事項に注意する必要があります。
子レコードに、対応する親レコードが存在しないレコードが含まれる場合、これらの行は、XML 形式の階層 Recordset には記述されません。 このため、これらの行は、その Recordset を保存場所から再度開いたときには失われています。
子レコードが複数の親レコードを参照している場合、 Recordset を再度開いたときに、その子 Recordset に重複するレコードが含まれる場合があります。 しかし、これらの重複は、基になる子行セットを直接操作しない限り、ユーザーにはわかりません。 ADO による唯一の移動手段であるチャプターを使用して子 Recordset を移動する場合、重複があることはユーザーにはわかりません。