Conjuntos de registros jerárquicos en XML
ADO permite la persistencia de objetos Recordset jerárquicos en XML. Con los objetos Recordset jerárquicos, el valor de un campo del objeto Recordset primario es otro objeto Recordset. Estos campos se representan como elementos secundarios en la secuencia XML en lugar de un atributo.
Observaciones
En el ejemplo siguiente se muestra este caso:
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;"
A continuación se muestra el formato XML del objeto Recordset persistente:
<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>
El orden exacto de las columnas del Recordset de origen no es obvio cuando se conserva de esta manera. Cualquier campo del elemento primario puede contener un objeto Recordset secundario. El proveedor de persistencia primero guarda todas las columnas escalares como atributos y luego guarda todas las "columnas" del conjunto de registros como elementos secundarios de la fila padre. La posición ordinal del campo en el objeto Recordset primario se puede obtener examinando la definición de esquema del objeto Recordset. Cada campo tiene una propiedad OLE DB, rs:number, definida en el espacio de nombres del esquema recordset que contiene el número ordinal de ese campo.
Los nombres de todos los campos del objeto Recordset secundario se concatenan con el nombre del campo del objeto Recordset primario que contiene este elemento secundario. Esto es para asegurarse de que no haya colisiones de nombres en los casos en los que los conjuntos de registros primarios y secundarios contienen un campo que se obtiene de dos tablas diferentes, pero se denomina singularmente.
Al guardar conjuntos de registros jerárquicos en XML, debe tener en cuenta las restricciones siguientes en ADO:
No se puede conservar un objeto Recordset jerárquico con actualizaciones pendientes en XML.
No se puede conservar un objeto Recordset jerárquico creado con un comando de forma con parámetros (en formato XML o ADTG).
Actualmente, ADO guarda la relación entre los conjuntos de registros padre e hijo como un BLOB (objeto binario grande). Las etiquetas XML para describir esta relación aún no se han definido en el espacio de nombres del esquema del conjunto de filas.
Cuando se guarda un Recordset jerárquico, todos los Recordsets secundarios se guardan junto con él. Si el Recordset actual es un elemento secundario de otro Recordset, su elemento primario no se guarda. Se guardan todos los conjuntos de registros secundarios que forman el subárbol del Recordset actual.
Cuando se vuelve a abrir un objeto Recordset jerárquico desde su formato persistente XML, debe tener en cuenta las siguientes limitaciones:
Si el registro secundario contiene registros para los cuales no hay registros primarios correspondientes, esas filas no se incluyen en la representación XML del Recordset jerárquico. Por lo tanto, estas filas se perderán cuando se vuelva a abrir el objeto Recordset desde su ubicación persistente.
Si un registro secundario tiene referencias a más de un registro primario, al volver a abrir el objeto Recordset, el objeto Recordset secundario puede contener registros duplicados. Sin embargo, estos duplicados solo serán visibles si el usuario trabaja directamente con el conjunto de filas secundario subyacente. Si se usa un capítulo para navegar por el Recordset hijo (que es la única manera de navegar por ADO), los duplicados no son visibles.