Condividi tramite


Sezione dello schema

La sezione dello schema è obbligatoria. Come illustrato nell'esempio precedente, ADO scrive metadati dettagliati su ogni colonna per preservare il più possibile la semantica dei valori dei dati per l'aggiornamento. Per il caricamento nel codice XML, tuttavia, ADO richiede solo i nomi delle colonne e il set di righe a cui appartengono. Di seguito è riportato un esempio di uno schema minimo:

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"  
    xmlns:rs="urn:schemas-microsoft-com:rowset"  
    xmlns:z="#RowsetSchema">  
  <s:Schema id="RowsetSchema">  
    <s:ElementType name="row" content="eltOnly">  
      <s:AttributeType name="ShipperID"/>  
      <s:AttributeType name="CompanyName"/>  
      <s:AttributeType name="Phone"/>  
      <s:Extends type="rs:rowbase"/>  
    </s:ElementType>  
  </s:Schema>  
  <rs:data>  
...  
  </rs:data>  
</xml>  

Nell'esempio precedente, ADO considera i dati come stringhe di lunghezza variabile poiché lo schema non contiene informazioni sul tipo di dati.

Creazione di alias per i nomi di colonna

L'attributo rs:name consente di creare un alias per un nome di colonna in modo da visualizzare un nome descrittivo nelle informazioni relative alle colonne esposte dal set di righe e un nome più breve nella sezione dati. Ad esempio, lo schema precedente può essere modificato per eseguire il mapping di ShipperID con s1, CompanyName con s2 e Phone con s3, come indicato di seguito:

<s:Schema id="RowsetSchema">   
<s:ElementType name="row" content="eltOnly" rs:updatable="true">   
<s:AttributeType name="s1" rs:name="ShipperID" rs:number="1" ...>   
...  
</s:AttributeType>   
<s:AttributeType name="s2" rs:name="CompanyName" rs:number="2" ...>   
...  
</s:AttributeType>   
<s:AttributeType name="s3" rs:name="Phone" rs:number="3" ...>   
...  
</s:AttributeType>   
...  
</s:ElementType>   
</s:Schema>  

Nella sezione dati, quindi, la riga userebbe l'attributo name (non rs:name) per fare riferimento a tale colonna:

"<row s1="1" s2="Speedy Express" s3="(503) 555-9831"/>  

La creazione di alias per i nomi di colonna è necessaria ogni volta che un nome di colonna non è un attributo o un nome tag valido in XML. Ad esempio, dal momento che i nomi con spazi incorporati non sono consentiti, è necessario assegnare un alias a "LastName". La riga seguente non verrà gestita correttamente dal parser XML, pertanto è necessario creare un alias con un nome senza spazio incorporato.

<row last name="Jones"/>  

Il valore usato per l'attributo name deve essere impiegato in modo coerente in tutte le posizioni in cui si fa riferimento alla colonna, sia nelle sezioni dello schema e che in quelle dei dati del documento XML. L'esempio seguente mostra un uso coerente di s1:

<s:Schema id="RowsetSchema">  
  <s:ElementType name="row" content="eltOnly">  
    <s:attribute type="s1"/>  
    <s:attribute type="CompanyName"/>  
    <s:attribute type="s3"/>  
    <s:extends type="rs:rowbase"/>  
  </s:ElementType>  
  <s:AttributeType name="s1" rs:name="ShipperID" rs:number="1"   
    rs:maydefer="true" rs:writeunknown="true">  
    <s:datatype dt:type="i4" dt:maxLength="4" rs:precision="10"   
      rs:fixedlength="true" rs:maybenull="true"/>  
  </s:AttributeType>  
</s:Schema>  
<rs:data>  
  <z:row s1="1" CompanyName="Speedy Express" s3="(503) 555-9831"/>  
</rs:data>  

Analogamente, poiché nell'esempio precedente non è stato definito alcun alias per CompanyName, è necessario usare CompanyNamein modo coerente in tutto il documento.

Tipi di dati

È possibile applicare un tipo di dati a una colonna con l'attributo dt:type. Per una guida definitiva ai tipi di dati XML consentiti, vedere la sezione Tipi di dati della specifica W3C XML-Data. È possibile specificare un tipo di dati in due modi: specificando l'attributo dt:type direttamente nella definizione della colonna o usando il costrutto s:datatype come elemento annidato della definizione della colonna. ad esempio:

<s:AttributeType name="Phone" >  
  <s:datatype dt:type="string"/>  
</s:AttributeType>  

equivale a

<s:AttributeType name="Phone" dt:type="string"/>  

Per impostazione predefinita, se si omette completamente l'attributo dt:type dalla definizione di riga, il tipo della colonna sarà una stringa di lunghezza variabile.

Se si dispone di un numero maggiore di informazioni sui tipi rispetto al semplice nome del tipo (ad esempio, dt:maxLength), l'uso dell'elemento figlio s:datatype è più leggibile. Si tratta semplicemente di una convenzione, non di un requisito.

Gli esempi seguenti mostrano inoltre come includere informazioni relative ai tipi nello schema.

<!-- 1. String with no max length -->  
<s:AttributeType name="title_id"/>  
<!-or -->  
<s:AttributeType name="title_id" dt:type="string"/>  
  
<!-- 2. Fixed length string with max length of 6 -->  
<s:AttributeType name="title_id">  
    <s:datatype dt:type="string" dt:maxLength="6" rs:fixedlength="true" />  
</s:AttributeType>  
  
<!-- 3. Variable length string with max length of 6 -->  
<s:AttributeType name="title_id">  
    <s:datatype dt:type="string" dt:maxLength="6" />  
</s:AttributeType>  
  
<!-- 4. Integer -->  
<s:AttributeType name="title_id" dt:type="int"/>  

Nel secondo esempio è presente un uso sottile dell'attributo rs:fixedlength. Una colonna con l'attributo rs:fixedlength impostato su true indica che i dati devono avere la lunghezza definita nello schema. In questo caso, i valori validi per title_id sono "123456" e "123 ". Tuttavia, "123" non sarebbe valido perché la lunghezza è 3, non 6. Per una descrizione più completa della proprietà fixedlength, vedere la Guida per programmatori OLE DB.

Gestione dei valori Null

I valori Null vengono gestiti dall'attributo rs:maybenull. Se questo attributo è impostato su true, il contenuto della colonna può presentare un valore Null. Inoltre, se la colonna non è presente in una riga di dati, l'utente che legge i dati restituiti dal set di righe otterrà uno stato Null da IRowset::GetData(). Considerare le definizioni di colonna seguenti dalla tabella Shippers (Corrieri).

<s:AttributeType name="ShipperID">  
  <s:datatype dt:type="int" dt:maxLength="4"/>  
</s:AttributeType>  
<s:AttributeType name="CompanyName">  
  <s:datatype dt:type="string" dt:maxLength="40" rs:maybenull="true"/>  
</s:AttributeType>  

Questa definizione consente di impostare un valore null per CompanyName, ma non per ShipperID. Se la sezione dati contiene la riga seguente, il provider salvataggi permanenti imposta lo stato dei dati per la colonna CompanyName sulla costante di stato OLE DB DBSTATUS_S_ISNULL:

<z:row ShipperID="1"/>  

Se la riga è completamente vuota, come nell'esempio seguente, il provider salvataggi permanenti restituirà uno stato OLE DB di DBSTATUS_E_UNAVAILABLE per ShipperID e DBSTATUS_S_ISNULL per CompanyName.

<z:row/>   

Si noti che una stringa di lunghezza zero non corrisponde a un valore Null.

<z:row ShipperID="1" CompanyName=""/>  

Per la riga precedente, il provider salvataggi permanenti restituirà uno stato OLE DB di DBSTATUS_S_OK per entrambe le colonne. Il parametro CompanyName in questo caso è semplicemente "" (stringa di lunghezza zero).

Per altre informazioni sui costrutti OLE DB disponibili per l'uso all'interno dello schema di un documento XML per OLE DB, vedere la definizione di "urn:schemas-microsoft-com:rowset" e la Guida per programmatori OLE DB.

Vedi anche

Persistenza di record in formato XML