Hierarchische Recordsets im XML-Format
ADO ermöglicht die Persistenz von hierarchischen Recordsetobjekten in XML. Bei hierarchischen Recordsetobjekten ist der Wert eines Felds im übergeordneten Recordset ein anderes Recordset. Diese Felder werden im XML-Datenstrom nicht als Attribute, sondern als untergeordnete Elemente dargestellt.
Bemerkungen
Dieses Szenario wird im folgenden Beispiel veranschaulicht:
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;"
Nachfolgend sehen Sie das XML-Format des persistierten Recordsets:
<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>
Wenn die Reihenfolge der Spalten im übergeordneten Recordset auf diese Weise persistiert wird, ist sie nicht offensichtlich. Jedes Feld im übergeordneten Element kann ein untergeordnetes Recordset enthalten. Der Persistenzanbieter persistiert zuerst alle Skalarspalten als Attribute und dann alle untergeordneten Recordset-„Spalten“ als untergeordnete Elemente der übergeordneten Zeile. Die Ordnungsposition des Felds im übergeordneten Recordset kann anhand der Schemadefinition des Recordsets bestimmt werden. Jedes Feld verfügt über eine OLE DB-Eigenschaft (rs:number), die im Recordset-Schemanamespace definiert ist und die Ordnungszahl für das jeweilige Feld enthält.
Die Namen aller Felder im untergeordneten Recordset werden mit dem Namen des Felds im übergeordneten Recordset verkettet, das dieses untergeordnete Objekt enthält. Auf diese Weise werden Konflikte verhindert, wenn ein übergeordnetes und ein untergeordnetes Recordset ein Feld enthalten, das aus zwei verschiedenen Tabellen abgerufen wird, aber einmalig benannt ist.
Beim Speichern von hierarchischen Recordsets in XML sollten die folgenden Einschränkungen in ADO beachtet werden:
Ein hierarchisches Recordset mit ausstehenden Updates kann nicht in XML persistiert werden.
Ein hierarchisches Recordset, das mit einem parametrisierten Shape-Befehl erstellt wurde, kann nicht (im XML- oder ADTG-Format) persistiert werden.
ADO speichert die Beziehung zwischen den übergeordneten und untergeordneten Recordsets derzeit als Binary Large Object (BLOB). XML-Tags zur Beschreibung dieser Beziehung wurden im Rowset-Schemanamespace noch nicht definiert.
Wenn ein hierarchisches Recordset gespeichert wird, werden alle untergeordneten Recordsets gemeinsam mit diesem Recordset gespeichert. Wenn das aktuelle Recordset ein untergeordnetes Element eines anderen Recordsets ist, wird das übergeordnete Recordset nicht gespeichert. Alle untergeordneten Recordsets, die die Unterstruktur des aktuellen Recordsets bilden, werden gespeichert.
Wenn ein hierarchisches Recordset im persistierten XML-Format erneut geöffnet wird, müssen die folgenden Einschränkungen beachtet werden:
Enthält der untergeordnete Datensatz Datensätze, für die keine entsprechenden übergeordneten Datensätze vorhanden sind, werden diese Zeilen nicht in die XML-Darstellung des hierarchischen Recordsets geschrieben. Daher gehen diese Zeilen verloren, wenn das Recordset aus dem persistierten Speicherort erneut geöffnet wird.
Wenn ein untergeordneter Datensatz Verweise auf mehrere übergeordnete Datensätze aufweist, enthält das untergeordnete Recordset beim erneuten Öffnen des Recordsets möglicherweise doppelte Datensätze. Diese Duplikate werden jedoch nur angezeigt, wenn die*der Benutzer*in direkt am zugrunde liegenden untergeordneten Rowset arbeitet. Wenn für die Navigation im untergeordneten Recordset ein Kapitel verwendet wird (dies ist die einzige Möglichkeit für die Navigation in ADO), sind die Duplikate nicht sichtbar.