Share via


Spécification d'un schéma de mappage annoté dans un code de mise à jour (updategram) (SQLXML 4.0)

S’applique à :SQL ServerAzure SQL Database

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 programme de mise à jour, vous pouvez fournir le nom d’un schéma de mappage annoté à utiliser pour mapper les éléments et les attributs du programme de mise à jour aux tables et 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 <de synchronisation> . 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 que vous êtes familiarisé avec les modèles et la prise en charge des schémas de mappage dans SQL Server. Pour plus d’informations, consultez Présentation des schémas XSD annotés (SQLXML 4.0). Pour les applications héritées qui utilisent XDR, consultez Schémas XDR annotés (déconseillés dans SQLXML 4.0).

Traitement des types de données

Si le schéma spécifie le type de données image, binaire ou varbinary SQL Server (à l’aide de sql:datatype) et ne spécifie pas de type de données XML, le programme de mise à jour suppose que le type de données XML est binaire base 64. Si vos données sont de 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 dateTime, date ou time XSD, vous devez également spécifier le type de données SQL Server correspondant à l’aide de sql:datatype="dateTime ».

Lors de la gestion des paramètres de SQL Server type money, 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 de travail à l’aide des exemples suivants, vous devez répondre aux exigences spécifiées dans Configuration requise pour l’exécution d’exemples SQLXML.

R. 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 programme de mise à jour utilise le même nom d’élément, <Customer>, que 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
  1. Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom SampleUpdateSchema.xml.

  2. 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"  
    
  3. 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 de 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) se compose de 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 programme de mise à jour suivant utilise ce schéma XSD pour ajouter un nouvel enregistrement de détails de commande (un <élément OD> dans le bloc après>) pour l’ordre< 43860. L’attribut mapping-schema est utilisé pour spécifier le schéma de mappage dans le updategram.

<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
  1. Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom SampleUpdateSchema.xml.

  2. Copiez le modèle de code de mise à jour (updategram) 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"  
    
  3. 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 de mise à jour utilise la relation parent-enfant spécifiée dans le XSD pour traiter les 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 suppose 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 de cet exemple contient <des éléments Customer> et <Order> , et spécifie une relation parent-enfant entre les deux éléments. Il identifie <Order> comme élément parent et <Customer> comme é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 de mise à jour tente d’abord d’insérer un enregistrement dans la table Ord (car <Order> est le parent), puis tente d’insérer un enregistrement dans la table Cust (car <Customer> est 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 indiquer à la logique du programme de mise à jour d’inverser la relation parent-enfant pendant l’opération de mise à jour, l’annotation inverse est spécifiée sur l’élément <de relation> . 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
  1. 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  
    
  2. Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom SampleUpdateSchema.xml.

  3. Copiez le modèle de code de mise à jour (updategram) 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"  
    
  4. 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.

Voir aussi

Considérations de sécurité relatives au code de mise à jour (updategram) (SQLXML 4.0)