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과 자식 Recordset 모두에 서로 다른 두 테이블에서 가져온 필드가 포함되어 있지만 단독으로 이름이 지정되는 경우 이름 충돌이 없도록 하기 위한 것입니다.
계층적 Recordset을 XML로 저장할 때 ADO에서 다음과 같은 제한 사항을 알고 있어야 합니다.
보류 중인 업데이트가 있는 계층적 Recordset은 XML에 유지할 수 없습니다.
매개 변수화된 셰이프 명령을 사용하여 만든 계층적 Recordset은 유지할 수 없습니다(XML 또는 ADTG 형식으로).
ADO는 현재 부모 Recordset과 자식 Recordset 간의 관계를 BLOB(Binary Large Object)으로 저장합니다. 이 관계를 설명하는 XML 태그는 행 집합 스키마 네임스페이스에 아직 정의되지 않았습니다.
계층적 Recordset이 저장되면 모든 자식 Recordset가 함께 저장됩니다. 현재 Recordset이 다른 Recordset의 자식인 경우 해당 부모는 저장되지 않습니다. 현재 Recordset의 하위 트리를 형성하는 모든 자식 Recordset이 저장됩니다.
계층적 Recordset이 XML 지속형 형식에서 다시 열리면 다음과 같은 제한 사항을 알고 있어야 합니다.
자식 레코드에 해당 부모 레코드가 없는 레코드가 포함된 경우 이러한 행은 계층적 Recordset의 XML 표현으로 작성되지 않습니다. 따라서 Recordset이 지속된 위치에서 다시 열리면 이러한 행이 손실됩니다.
자식 레코드에 둘 이상의 부모 레코드에 대한 참조가 있는 경우 Recordset을 다시 열 때 자식 Recordset에 중복 레코드가 포함될 수 있습니다. 그러나 이러한 중복 항목은 사용자가 기본 자식 행 집합을 직접 사용하는 경우에만 표시됩니다. ADO를 탐색하는 유일한 방법인 자식 Recordset을 탐색하는 데 챕터를 사용하는 경우 중복 항목이 표시되지 않습니다.