Condividi tramite


Recordset gerarchici in XML

ADO consente la persistenza di oggetti Recordset gerarchici in XML. Con gli oggetti Recordset gerarchici, il valore di un campo nel Recordset padre è un altro oggetto Recordset. Tali campi sono rappresentati come elementi figlio nel flusso XML, anziché come attributo.

Osservazioni:

L'esempio seguente dimostra questo 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;"  

Di seguito è riportato il formato XML del 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>   

L'ordine esatto delle colonne nel Recordset padre non è ovvio quando è persistente in questo modo. Qualsiasi campo nell'elemento padre può contenere un Recordset figlio. Il provider di persistenza mantiene tutte le colonne scalari prima come attributi e quindi mantiene tutte le "colonne" dei Recordset figlio come elementi figlio della riga padre. La posizione ordinale del campo nel Recordset padre può essere ottenuta esaminando la definizione dello schema del Recordset. Ogni campo ha una proprietà OLE DB, rs:number, definita nello spazio dei nomi dello schema Recordset contenente il numero ordinale per tale campo.

I nomi di tutti i campi nel Recordset figlio vengono concatenati con il nome del campo nel Recordset padre contenente questo elemento figlio. Ciò consente di garantire che non siano presenti collisioni di nomi nei casi in cui i Recordset padre e figlio contengano entrambi un campo ottenuto da due tabelle diverse, ma denominato singolarmente.

Quando si salvano Recordset gerarchici in XML, è necessario tenere presente le restrizioni seguenti in ADO:

  • Un Recordset gerarchico con aggiornamenti in sospeso non può essere salvato in modo permanente in XML.

  • Non è possibile salvare in modo permanente un Recordset gerarchico creato con un comando forma con parametri (in formato XML o ADTG).

  • ADO salva attualmente la relazione tra i Recordset padre e figlio come oggetto binario di grandi dimensioni (BLOB). I tag XML per descrivere questa relazione non sono ancora stati definiti nello spazio dei nomi dello schema del set di righe.

  • Quando si salva un Recordset gerarchico, tutti i Recordset figlio vengono salvati con esso. Se l'oggetto Recordset corrente è un elemento figlio di un altro oggetto Recordset, il relativo elemento padre non viene salvato. Tutti i Recordset figlio che formano il sottoalbero del Recordset corrente vengono salvati.

Quando un Recordset gerarchico viene riaperto dal formato XML salvato in modo permanente, è necessario tenere presente le limitazioni seguenti:

  • Se il record figlio contiene record per i quali non sono presenti record padre corrispondenti, queste righe non vengono scritte nella rappresentazione XML del Recordset gerarchico. Pertanto, queste righe andranno perse quando l'oggetto Recordset viene riaperto dalla sua posizione persistente.

  • Se un record figlio ha riferimenti a più di un record padre, alla riapertura del Recordset, il Recordset figlio può contenere record duplicati. Tuttavia, questi duplicati saranno visibili solo se l'utente lavora direttamente con il set di righe figlio sottostante. Se si usa un capitolo per esplorare il Recordset figlio, ovvero l'unico modo per spostarsi all'interno di ADO, i duplicati non sono visibili.

Vedi anche

Persistenza di record in formato XML