Partager via


Section Schéma

La section schéma est requise. Comme l’illustre l’exemple précédent, ADO écrit des métadonnées détaillées sur chaque colonne pour conserver la sémantique des valeurs de données autant que possible pour la mise à jour. Toutefois, pour charger dans le code XML, ADO nécessite uniquement les noms des colonnes et de l’ensemble de lignes auquel elles appartiennent. Voici un exemple de schéma minimal :

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

Dans l’exemple précédent, ADO traite les données comme des chaînes de longueur variable, car aucune information de type n’est incluse dans le schéma.

Création d’alias pour les noms de colonnes

L’attribut rs :name vous permet de créer un alias pour un nom de colonne afin qu’un nom convivial puisse apparaître dans les informations de colonne exposées par l’ensemble de lignes et qu’un nom plus court peut être utilisé dans la section de données. Par exemple, le schéma précédent peut être modifié pour mapper ShipperID à s1, CompanyName to s2 et Phone to s3 comme suit :

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

Ensuite, dans la section données, la ligne utilise l’attribut name (et non rs :name) pour faire référence à cette colonne :

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

La création d’alias pour les noms de colonnes est requise chaque fois qu’un nom de colonne n’est pas un attribut ou un nom de balise valide dans XML. Par exemple, « LastName » doit avoir un alias, car les noms avec des espaces incorporés ne sont pas valides. La ligne suivante ne sera pas gérée correctement par l’analyseur XML. Vous devez donc créer un alias pour un autre nom qui n’a pas d’espace incorporé.

<row last name="Jones"/>  

Quelle que soit la valeur que vous utilisez pour l’attribut 'name', elle doit être utilisée de manière cohérente partout où la colonne est référencée dans les sections de schéma et de données du document XML. L’exemple suivant montre l’utilisation cohérente de 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>  

De même, étant donné qu’aucun alias n’est défini pour CompanyName dans l’exemple précédent, CompanyName doit être utilisé de manière cohérente dans tout le document.

Types de données

Vous pouvez appliquer un type de données à une colonne avec l’attribut dt :type. Pour obtenir le guide définitif sur les types XML autorisés, consultez la section Types de données de la spécification XML-Data W3C . Vous pouvez spécifier un type de données de deux façons : spécifiez l’attribut dt :type directement sur la définition de colonne elle-même ou utilisez la construction s :datatype comme élément imbriqué de la définition de colonne. Par exemple

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

équivaut à

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

Si vous omettez entièrement l’attribut dt :type de la définition de ligne, par défaut, le type de la colonne est une chaîne de longueur variable.

Si vous avez plus d’informations de type que simplement le nom de type (par exemple, dt :maxLength), il est plus lisible d’utiliser l’élément enfant s :datatype. Il s’agit simplement d’une convention, mais pas d’une exigence.

Les exemples suivants montrent comment inclure des informations de type dans votre schéma.

<!-- 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"/>  

Il existe une utilisation subtile de l’attribut rs :fixedlength dans le deuxième exemple. Une colonne avec l’attribut rs :fixedlength défini sur true signifie que les données doivent avoir la longueur définie dans le schéma. Dans ce cas, une valeur valide pour title_id est « 123456 », comme « 123 ». Toutefois, « 123 » ne serait pas valide, car sa longueur est 3, pas 6. Consultez le Guide du programmeur OLE DB pour obtenir une description plus complète de la propriété fixedlength.

Gestion des Null

Les valeurs Null sont gérées par l’attribut rs :maybenull. Si cet attribut a la valeur true, le contenu de la colonne peut contenir une valeur Null. En outre, si la colonne n’est pas trouvée dans une ligne de données, l’utilisateur qui lit les données à partir de l’ensemble de lignes obtient un état Null à partir de IRowset ::GetData(). Tenez compte des définitions de colonnes suivantes de la table Expéditeurs.

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

La définition permet CompanyName d’être null, mais ShipperID ne peut pas contenir de valeur Null. Si la section de données contenait la ligne suivante, le fournisseur de persistance définirait l’état des données de la colonne CompanyName sur la constante d’état OLE DB DBSTATUS_S_ISNULL :

<z:row ShipperID="1"/>  

Si la ligne était entièrement vide, comme suit, le fournisseur de persistance retourne un état OLE DB de DBSTATUS_E_UNAVAILABLE pour ShipperID et DBSTATUS_S_ISNULL pour CompanyName.

<z:row/>   

Notez qu’une chaîne de longueur nulle n’est pas identique à null.

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

Pour la ligne précédente, le fournisseur de persistance retourne un état OLE DB de DBSTATUS_S_OK pour les deux colonnes. La CompanyName dans ce cas est simplement « » (chaîne de longueur nulle).

Pour plus d’informations sur les constructions OLE DB disponibles pour une utilisation dans le schéma d’un document XML pour OLE DB, consultez la définition de « urn :schemas-microsoft-com :rowset » et le Guide du programmeur OLE DB.

Voir aussi

Enregistrer des enregistrements au format XML