次の方法で共有


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 内を移動する唯一の方法)、重複は表示されません。

参照

レコードを XML 形式で保持する