Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : Access 2013, Office 2013
Section Schema
La section Schema est obligatoire. Comme illustré dans l'exemple précédent, ADO écrit des métadonnées détaillées concernant chaque colonne pour préserver au mieux la sémantique des valeurs en vue de leur mise à jour. Cependant, pour les charger dans le fichier XML, ADO a uniquement besoin des noms des colonnes et du jeu 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 parce qu'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 d'un nom de colonne pour qu'un nom convivial puisse apparaître dans les informations de colonne exposées par le jeu de lignes et qu'un nom plus court puisse être utilisé dans la section de données. Le schéma ci-dessus peut, par exemple, être modifié pour mapper ShipperID et s1, CompanyName et s2, Phone et 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 de 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 lorsqu'un nom de colonne n'est pas un attribut ou un nom de balise conforme dans XML. Par exemple, « Last Name » doit avoir un alias car les noms contenant des espaces incorporés ne sont pas des attributs conformes. Étant donné que la ligne suivante ne sera pas traitée correctement par l'analyseur XML, vous devez créer un alias d'un autre nom, sans espace incorporé :
<row last name="Jones"/>
La valeur utilisée pour l'attribut name, quelle qu'elle soit, doit être utilisée de façon systématique chaque fois que la colonne est référencée dans les sections relatives au schéma et aux données du document XML. L'exemple suivant illustre une 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 la même façon, aucun alias n'étant défini pour CompanyName, CompanyName doit être utilisé de façon cohérente dans l'ensemble du document.
Types de données
Vous pouvez appliquer un type de données à une colonne avec l'attribut dt:type. Un type de données peut être défini de deux manières : soit en spécifiant directement l'attribut dt:type dans la définition de colonne proprement dite, soit en utilisant 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 complètement l'attribut dt:type dans la définition de ligne, le type de colonne sera, par défaut, une chaîne de longueur variable.
Si vous disposez d'informations sur le type autres que son nom (par exemple, dt:maxLength), l'utilisation de l'élément enfant s:datatype permettra d'améliorer la lisibilité. Notez qu'il s'agit là d'une convention, non d'une obligation.
Les exemples suivants illustrent l'insertion d'informations de type dans un 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"/>
Le deuxième exemple présente une utilisation subtile de l'attribut rs:fixedlength. Une colonne dont l'attribut rs:fixedlength a la valeur True signifie que les données doivent avoir la longueur définie dans le schéma. Dans ce cas, une valeur juridique pour title_id est « 123456 », tout comme « 123 ». Toutefois, « 123 » ne serait pas valide, car sa longueur est 3, et non 6. Pour plus d'informations sur la propriété fixedlength, consultez le manuel OLE DB Programmer's Guide (en anglais).
Gestion des valeurs 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 est introuvable dans une ligne de données et que l'utilisateur lit les données dans le jeu de lignes, IRowset::GetData() retourne un état Null. Observez les définitions de colonnes de la table Shippers suivantes :
<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>
D'après la définition, la valeur CompanyName peut être Null, mais le champ ShipperID ne peut contenir de valeur Null. Si la section de données contient la ligne suivante, le fournisseur de persistance définit la constante d'état OLE DB, DBSTATUS_S_ISNULL, comme valeur d'état des données pour la colonne CompanyName :
<z:row ShipperID="1"/>
Si la ligne était complètement vide, comme présenté ci-après, le fournisseur de persistance retourne l'état OLE DB DBSTATUS_E_UNAVAILABLE pour la colonne ShipperID et l'état DBSTATUS_S_ISNULL pour la colonne CompanyName.
<z:row/>
Notez qu'une chaîne vide (de longueur nulle) n'équivaut pas à une chaîne de valeur Null.
<z:row ShipperID="1" CompanyName=""/>
Pour la ligne précédente, le fournisseur de persistance retourne l'état OLE DB, DBSTATUS_S_OK, pour les deux colonnes. Dans ce cas, la valeur de la colonne CompanyName est simplement "" (une chaîne vide).
Pour plus d'informations sur les constructions OLE DB utilisables dans le schéma d'un document XML pour OLE DB, reportez-vous à la définition de « "urn:schemas-microsoft-com:rowset » et au manuel OLE DB Programmer's Guide (en anglais).