Spécification d'un schéma de mappage annoté dans un code de mise à jour (updategram) (SQLXML 4.0)
Cette rubrique explique comment le schéma de mappage (XSD ou XDR) spécifié dans un code de mise à jour est utilisé pour traiter les mises à jour. Dans un code de mise à jour, vous pouvez fournir le nom d'un schéma de mappage annoté qui sera utilisé pour mapper les éléments et les attributs dans le code de mise à jour aux tables et aux colonnes dans Microsoft SQL Server. Lorsqu'un schéma de mappage est spécifié dans un code de mise à jour, les noms d'élément et d'attribut spécifiés dans le code de mise à jour doivent être mappés aux éléments et aux attributs dans le schéma de mappage.
Pour spécifier un schéma de mappage, vous utilisez l'attribut mapping-schema de l'élément <sync>. Les exemples suivants présentent deux codes de mise à jour : l'un utilise un schéma de mappage simple et l'autre utilise un schéma plus complexe.
Notes
Cette documentation suppose une connaissance suffisante des modèles et de la prise en charge des schémas de mappage dans SQL Server. Pour plus d'informations, consultez Introduction aux schémas XSD annotés (SQLXML 4.0). Pour les applications héritées qui utilisent XDR, consultez Schémas XDR annotés (désapprouvés dans SQLXML 4.0).
Traitement des types de données
Si le schéma spécifie le type de données image, binary ou varbinarySQL Server (en utilisant sql:datatype) et qu'il ne spécifie pas de type de données XML, le code de mise à jour part du principe que le type de données XML est binary base 64. Si vos données sont du type bin.base, vous devez spécifier explicitement le type (dt:type=bin.base ou type="xsd:hexBinary").
Si le schéma spécifie le type de données XSD dateTime, dateou time, vous devez également spécifier le type de données SQL Server correspondant en utilisant sql:datatype="dateTime".
Lorsque vous gérez des paramètres de type SQL Servermoney, vous devez spécifier explicitement sql:datatype="money" sur le nœud approprié dans le schéma de mappage.
Exemples
Pour créer des exemples fonctionnels à l'aide des exemples suivants, les conditions spécifiées dans Configuration requise pour l'exécution des exemples SQLXML doivent être réunies.
A. Création d'un code de mise à jour avec un schéma de mappage simple
Le schéma XSD suivant (SampleSchema.xml) est un schéma de mappage qui mappe l'élément <Customer> à la table Sales.Customer :
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Customer" sql:relation="Sales.Customer" >
<xsd:complexType>
<xsd:attribute name="CustID"
sql:field="CustomerID"
type="xsd:string" />
<xsd:attribute name="RegionID"
sql:field="TerritoryID"
type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
Le code de mise à jour suivant insère un enregistrement dans la table Sales.Customer et compte sur le schéma de mappage précédent pour mapper correctement ces données à la table. Notez que le code de mise à jour utilise le même nom d'élément, <Customer>, comme défini dans le schéma. C'est absolument essentiel dans la mesure où le code de mise à jour spécifie un schéma particulier.
Pour tester le code de mise à jour
Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom SampleUpdateSchema.xml.
Copiez le modèle de code de mise à jour ci-dessous et collez-le dans un fichier texte. Enregistrez le fichier sous le nom SampleUpdategram.xml dans le répertoire où vous avez enregistré le fichier SampleUpdateSchema.xml.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <updg:sync mapping-schema="SampleUpdateSchema.xml"> <updg:before> <Customer CustID="1" RegionID="1" /> </updg:before> <updg:after> <Customer CustID="1" RegionID="2" /> </updg:after> </updg:sync> </ROOT>
Le chemin d'accès au répertoire spécifié pour le schéma de mappage (SampleUpdateSchema.xml) est relatif au répertoire où le modèle est enregistré. Vous pouvez également spécifier un chemin d'accès absolu, par exemple :
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.
Pour plus d'informations, consultez Utilisation d'ADO pour exécuter des requêtes SQLXML 4.0.
Voici le schéma XDR équivalent :
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustID" />
<AttributeType name="RegionID" />
<attribute type="CustID" sql:field="CustomerID" />
<attribute type="RegionID" sql:field="TerritoryID" />
</ElementType>
</Schema>
B. Insertion d'un enregistrement à l'aide de la relation parent-enfant spécifiée dans le schéma de mappage
Les éléments du schéma peuvent être liés. L'élément <sql:relationship> spécifie la relation parent-enfant entre les éléments du schéma. Ces informations sont utilisées pour mettre à jour les tables correspondantes qui ont une relation clé primaire/clé étrangère.
Le schéma de mappage suivant (SampleSchema.xml) comprend deux éléments, <Order> et <OD> :
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="OrderOD"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="OD"
sql:relation="Sales.SalesOrderDetail"
sql:relationship="OrderOD" >
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="ProductID" type="xsd:integer" />
<xsd:attribute name="UnitPrice" type="xsd:decimal" />
<xsd:attribute name="OrderQty" type="xsd:integer" />
<xsd:attribute name="UnitPriceDiscount" type="xsd:decimal" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="OrderDate" type="xsd:date" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
Le code de mise à jour suivant utilise ce schéma XSD pour ajouter un nouvel enregistrement de détail de commande (élément <OD> dans le bloc <after> ) pour la commande 43860. L'attribut mapping-schema est utilisé pour spécifier le schéma de mappage dans le code de mise à jour.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleUpdateSchema.xml" >
<updg:before>
<Order SalesOrderID="43860" />
</updg:before>
<updg:after>
<Order SalesOrderID="43860" >
<OD ProductID="753" UnitPrice="$10.00"
Quantity="5" Discount="0.0" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
Pour tester le code de mise à jour
Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom SampleUpdateSchema.xml.
Copiez le modèle de code de mise à jour ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom SampleUpdategram.xml dans le répertoire où vous avez enregistré le fichier SampleUpdateSchema.xml.
Le chemin d'accès au répertoire spécifié pour le schéma de mappage (SampleUpdateSchema.xml) est relatif au répertoire où le modèle est enregistré. Vous pouvez également spécifier un chemin d'accès absolu, par exemple :
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.
Pour plus d'informations, consultez Utilisation d'ADO pour exécuter des requêtes SQLXML 4.0.
Voici le schéma XDR équivalent :
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<AttributeType name="UnitPrice" dt:type="fixed.14.4" />
<AttributeType name="OrderQty" />
<AttributeType name="UnitPriceDiscount" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
<attribute type="UnitPrice" />
<attribute type="OrderQty" />
<attribute type="UnitPriceDiscount" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
<AttributeType name="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
<element type="OD" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail" />
</element>
</ElementType>
</Schema>
C. Insertion d'un enregistrement à l'aide de la relation parent-enfant et de l'annotation inverse spécifiées dans le schéma XSD
Cet exemple montre comment la logique du code de mise à jour utilise la relation parent-enfant spécifiée dans le schéma XSD pour traiter des mises à jour, et comment l'annotation inverse est utilisée. Pour plus d'informations sur l'annotation inverse, consultez Spécification de l'attribut sql:inverse sur sql:relationship (SQLXML 4.0).
Cet exemple part du principe que les tables suivantes se trouvent dans la base de données tempdb :
Cust (CustomerID, CompanyName), où CustomerID est la clé primaire
Ord (OrderID, CustomerID), où CustomerID est une clé étrangère qui fait référence à la clé primaire CustomerID dans la table Cust.
Le code de mise à jour utilise le schéma XSD suivant pour insérer des enregistrements dans les tables Cust et Ord :
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="OrdCust" inverse="true"
parent="Ord"
parent-key="CustomerID"
child-key="CustomerID"
child="Cust"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Ord">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Customer" sql:relationship="OrdCust"/>
</xsd:sequence>
<xsd:attribute name="OrderID" type="xsd:int"/>
<xsd:attribute name="CustomerID" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Customer" sql:relation="Cust">
<xsd:complexType>
<xsd:attribute name="CustomerID" type="xsd:string"/>
<xsd:attribute name="CompanyName" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Le schéma XSD dans cet exemple possède des éléments <Customer> et <Order>, et spécifie une relation parent-enfant entre les deux éléments. Il identifie <Order> comme l'élément parent et <Customer> comme l'élément enfant.
La logique de traitement du code de mise à jour utilise les informations relatives à la relation parent-enfant pour déterminer l'ordre dans lequel les enregistrements sont insérés dans les tables. Dans cet exemple, la logique du code de mise à jour tente d'abord d'insérer un enregistrement dans la table Ord (<Order> étant le parent), puis tente d'insérer un enregistrement dans la table Cust (<Customer> étant l'enfant). Toutefois, en raison des informations de clé primaire/clé étrangère contenues dans le schéma de la table de base de données, cette opération d'insertion provoque une violation de clé étrangère dans la base de données et échoue.
Pour donner à la logique du code de mise à jour l'instruction d'inverser la relation parent-enfant pendant l'opération de mise à jour, l'annotation inverse est spécifiée sur l'élément <relationship>. En conséquence, les enregistrements sont d'abord ajoutés dans la table Cust, puis dans la table Ord, et l'opération réussit.
Le code de mise à jour suivant insère une commande (OrderID=2) dans la table Ord et un client (CustomerID='AAAAA') dans la table Cust à l'aide du schéma XSD spécifié :
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleUpdateSchema.xml" >
<updg:before/>
<updg:after>
<Order OrderID="2" CustomerID="AAAAA" >
<Customer CustomerID="AAAAA" CompanyName="AAAAA Company" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
Pour tester le code de mise à jour
Créez ces tables dans la base de données tempdb :
USE tempdb CREATE TABLE Cust(CustomerID varchar(5) primary key, CompanyName varchar(20)) GO CREATE TABLE Ord (OrderID int primary key, CustomerID varchar(5) references Cust(CustomerID)) GO
Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom SampleUpdateSchema.xml.
Copiez le modèle de code de mise à jour ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom SampleUpdategram.xml dans le répertoire où vous avez enregistré le fichier SampleUpdateSchema.xml.
Le chemin d'accès au répertoire spécifié pour le schéma de mappage (SampleUpdateSchema.xml) est relatif au répertoire où le modèle est enregistré. Vous pouvez également spécifier un chemin d'accès absolu, par exemple :
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.
Pour plus d'informations, consultez Utilisation d'ADO pour exécuter des requêtes SQLXML 4.0.