Freigeben über


Hierarchische Recordsets in XML

Gilt für: Access 2013, Office 2013

Hierarchische Recordsets in XML

ADO ermöglicht das Speichern von hierarchischen Recordset -Objekten in XML. Bei hierarchischen Recordset -Objekten ist der Wert eines Felds im übergeordneten Recordset -Objekt ein weiteres Recordset -Objekt. Solche Felder werden nicht als Attribut, sondern als untergeordnete Elemente im XML-Datenstrom dargestellt. Das folgende Beispiel veranschaulicht diesen Fall:

 
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;" 

Dies ist das XML-Format des gespeicherten Recordset -Objekts:

 
<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>  

Die genaue Reihenfolge der Spalten im übergeordneten Recordset -Objekt ist nicht offensichtlich, wenn es auf diese Weise gespeichert wird. Jedes Feld im übergeordneten Element kann ein untergeordnetes Recordset -Objekt enthalten. Der Anbieter für Persistenz speichert alle Skalarspalten zuerst als Attribute und speichert dann alle "Spalten" des untergeordneten Recordset -Objekts als untergeordnete Elemente der übergeordneten Zeile. Die Position des Felds im übergeordneten Recordset -Objekt kann durch Anzeigen der Schemadefinition des Recordset -Objekts abgerufen werden. Für jedes Feld ist eine OLE DB-Eigenschaft, nämlich rs:number, im Schemanamespace des Recordset -Objekts definiert, die die Ordnungszahl für dieses Feld enthält.

Die Namen aller Felder im untergeordneten Recordset -Objekt sind mit dem Namen des Felds im übergeordneten Recordset -Objekt verkettet, das dieses untergeordnete Element enthält. Dadurch wird sichergestellt, dass keine Namenskonflikte auftreten, wenn das übergeordnete und das untergeordnete Recordset -Objekt ein Feld enthält, das von zwei verschiedenen Tabellen stammt, aber gleich benannt ist.

Beim Speichern hierarchischer Recordset -Objekte in XML sollten Sie die folgenden Einschränkungen in ADO beachten:

  • Ein hierarchisches Recordset -Objekt mit ausstehenden Aktualisierungen kann nicht in XML gespeichert werden.

  • Ein hierarchisches Recordset -Objekt, das mit einem parametrisierten SHAPE-Befehl erstellt wurde, kann nicht gespeichert werden (weder im XML- noch im ADTG-Format).

  • ADO speichert derzeit die Beziehung zwischen dem übergeordneten und untergeordneten Recordset -Objekt als BLOB (Binary Large Object). XML-Tags zur Beschreibung dieser Beziehung wurden noch nicht im Rowsetschemanamespace definiert.

  • Wenn ein hierarchisches Recordset -Objekt gespeichert wird, werden auch alle untergeordneten Recordset -Objekte gespeichert. Falls das aktuelle Recordset -Objekt ein untergeordnetes Element eines anderen Recordset -Objekts ist, wird das übergeordnete Element nicht gespeichert. Alle untergeordneten Recordset -Objekte, die die Unterstruktur des aktuellen Recordset -Objekts darstellen, werden gespeichert.

Wenn ein hierarchisches Recordset -Objekt im gespeicherten XML-Format erneut geöffnet wird, müssen Sie folgende Einschränkungen beachten:

  • Wenn der untergeordnete Datensatz Datensätze enthält, für die es keine entsprechenden übergeordneten Datensätze gibt, werden diese Zeilen nicht in der XML-Darstellung des hierarchischen Recordset -Objekts ausgegeben. Diese Zeilen gehen demnach verloren, wenn das Recordset -Objekt im Speicherort erneut geöffnet wird.

  • Wenn ein untergeordneter Datensatz Verweise auf mehrere übergeordnete Datensätze aufweist, kann beim erneuten Öffnen des Recordset -Objekts das untergeordnete Recordset -Objekt doppelte Datensätze enthalten. Diese Duplikate werden jedoch nur angezeigt, wenn der Benutzer direkt mit dem zugrunde liegenden untergeordneten Rowset arbeitet. Falls ein Kapitel zum Navigieren des untergeordneten Recordset -Objekts verwendet wird (dies ist die einzige Navigationsmöglichkeit in ADO), werden die Duplikate nicht angezeigt.