Section de schéma
La section schema 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 le code XML, ADO requiert uniquement les noms des colonnes et l’ensemble de lignes auquel ces dernières 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 un nom plus court peut être utilisé dans la section data. 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 data, 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 en 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 avec 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 de nom, vous devez l’utiliser de manière cohérente à chaque endroit où la colonne est référencée à la fois dans les sections schema et data 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 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 des types XML autorisés, consultez la section Types de données de la spécification W3C XML-Data. 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 sur le type que 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"/>
Notez l’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 », tout comme l’est « 123 ». Toutefois, « 123 » ne serait pas valide, car sa longueur est 3, et non 6. Consultez le Guide du programmeur OLE DB pour obtenir une description plus complète de la propriété fixedlength.
Gestion des valeurs null
Les valeurs null sont gérées par l’attribut rs:maybenull. Si cet attribut est défini sur true, le contenu de la colonne peut contenir une valeur null. En outre, si la colonne est introuvable dans une ligne de données, l’utilisateur lisant 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 autorise CompanyName
à avoir la valeur null, mais ShipperID
ne peut pas contenir de valeur null. Si la section data 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. Le 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.