Condividi tramite


Specificazione di uno schema di mapping annotato in un updategram (SQLXML 4.0)

In questo argomento viene illustrato come viene usato lo schema di mapping (XSD o XDR) specificato in un updategram per elaborare gli aggiornamenti. In un updategram è possibile specificare il nome di uno schema di mapping con annotazioni da usare per eseguire il mapping degli elementi e degli attributi nell'updategram alle tabelle e alle colonne in Microsoft SQL Server. Quando si specifica uno schema di mapping in un updategram, i nomi di elemento e attributo specificati nell'updategram devono essere mappati agli elementi e agli attributi nello schema di mapping.

Per specificare uno schema di mapping, usare l'attributo mapping-schema dell'elemento <sync> . Negli esempi seguenti vengono illustrati due updategram: uno che usa uno schema di mapping semplice e uno che usa uno schema più complesso.

Annotazioni

Questa documentazione presuppone che si abbia familiarità con i modelli e il supporto dello schema di mapping in SQL Server. Per altre informazioni, vedere Introduzione agli schemi XSD con annotazioni (SQLXML 4.0). Per le applicazioni legacy che usano XDR, vedere Annotated XDR Schemas (Deprecato in SQLXML 4.0).

Gestione dei tipi di dati

Se lo schema specifica il imagetipo di dati , binaryo varbinarySQL Server (tramite sql:datatype) e non specifica un tipo di dati XML, l'updategram presuppone che il tipo di dati XML sia binary base 64. Se i dati sono bin.base di tipo, è necessario specificare in modo esplicito il tipo (dt:type=bin.base o type="xsd:hexBinary").

Se lo schema specifica il dateTimetipo di dati , dateo time XSD, è necessario specificare anche il tipo di dati SQL Server corrispondente usando sql:datatype="dateTime".

Quando si gestiscono i parametri di tipo SQL Server money , è necessario specificare sql:datatype="money" in modo esplicito nel nodo appropriato nello schema di mapping.

Esempi

Per creare esempi funzionanti usando gli esempi seguenti, è necessario soddisfare i requisiti specificati in Requisiti per l'esecuzione di esempi SQLXML.

Un. Creazione di un updategram con uno schema di mapping semplice

Lo schema XSD seguente (SampleSchema.xml) è uno schema di mapping che esegue il mapping dell'elemento <Customer> alla tabella 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>  

L'updategram seguente inserisce un record nella tabella Sales.Customer e si basa sullo schema di mapping precedente per eseguire correttamente il mapping dei dati alla tabella. Si noti che l'updategram usa lo stesso nome di elemento, <Customer>, come definito nello schema. Questa operazione è obbligatoria perché l'updategram specifica uno schema specifico.

Per testare l'updategram
  1. Copiare il codice dello schema precedente e incollarlo in un file di testo. Salvare il file come SampleUpdateSchema.xml.

  2. Copiare il modello updategram seguente e incollarlo in un file di testo. Salvare il file come SampleUpdategram.xml nella stessa directory in cui è stato salvato 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>  
    

    Il percorso della directory specificato per lo schema di mapping (SampleUpdateSchema.xml) è relativo alla directory in cui viene salvato il modello. È possibile specificare anche un percorso assoluto, ad esempio:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. Creare e utilizzare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire il modello.

    Per altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.

Questo è lo schema XDR equivalente:

<?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. Inserimento di un record tramite la relazione padre-figlio specificata nello schema di mapping

Gli elementi dello schema possono essere correlati. L'elemento <sql:relationship> specifica la relazione padre-figlio tra gli elementi dello schema. Queste informazioni vengono usate per aggiornare le tabelle corrispondenti con relazione primary-key/foreign-key.

Lo schema di mapping seguente (SampleSchema.xml) è costituito da due elementi, <Order> ed <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>  

L'updategram seguente usa questo schema XSD per aggiungere un nuovo record dettagli ordine (un <elemento OD> nel blocco dopo>) per l'ordine< 43860. L'attributo mapping-schema viene usato per specificare lo schema di mapping nell'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>  
Per testare l'updategram
  1. Copiare il codice dello schema precedente e incollarlo in un file di testo. Salvare il file come SampleUpdateSchema.xml.

  2. Copiare il modello updategram precedente e incollarlo in un file di testo. Salvare il file come SampleUpdategram.xml nella stessa directory in cui è stato salvato SampleUpdateSchema.xml.

    Il percorso della directory specificato per lo schema di mapping (SampleUpdateSchema.xml) è relativo alla directory in cui viene salvato il modello. È possibile specificare anche un percorso assoluto, ad esempio:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. Creare e utilizzare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire il modello.

    Per altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.

Questo è lo schema XDR equivalente:

<?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. Inserimento di un record utilizzando la relazione padre-figlio e l'annotazione inversa specificata nello schema XSD

In questo esempio viene illustrato come la logica updategram usa la relazione padre-figlio specificata in XSD per elaborare gli aggiornamenti e come viene usata l'annotazione inverse . Per altre informazioni sull'annotazione, vedere Specifica dell'attributo sql:inverse in sql:relationship (SQLXML 4.0).For more information about the annotation, see Specifying the sql:inverse Attribute on sql:relationship (SQLXML 4.0).inverse

In questo esempio si presuppone che le tabelle seguenti si trovino nel database tempdb :

  • Cust (CustomerID, CompanyName), dove CustomerID è la chiave primaria

  • Ord (OrderID, CustomerID), dove CustomerID è una chiave esterna che fa riferimento alla CustomerID chiave primaria nella Cust tabella.

L'updategram usa lo schema XSD seguente per inserire record nelle tabelle Cust e 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>  

Lo schema XSD in questo esempio include <elementi Customer> e <Order> e specifica una relazione padre-figlio tra i due elementi. Identifica <Order> come elemento padre e <Customer> come elemento figlio.

La logica di elaborazione dell'updategram usa le informazioni sulla relazione padre-figlio per determinare l'ordine in cui i record vengono inseriti nelle tabelle. In questo esempio, la logica dell'updategram tenta innanzitutto di inserire un record nella tabella Ord (perché <Order> è l'elemento padre) e quindi tenta di inserire un record nella tabella Cust (perché <Customer> è l'elemento figlio). Tuttavia, a causa delle informazioni sulla chiave primaria o sulla chiave esterna contenute nello schema della tabella di database, questa operazione di inserimento causa una violazione di chiave esterna nel database e l'inserimento non riesce.

Per indicare alla logica dell'updategram di invertire la relazione padre-figlio durante l'operazione di aggiornamento, l'annotazione inverse viene specificata nell'elemento <della relazione> . Di conseguenza, i record vengono aggiunti prima nella tabella Cust e quindi nella tabella Ord e l'operazione ha esito positivo.

L'updategram seguente inserisce un ordine (OrderID=2) nella tabella Ord e un cliente (CustomerID='AAAAA') nella tabella Cust usando lo schema XSD specificato:

<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>  
Per testare l'updategram
  1. Creare queste tabelle nel database 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. Copiare il codice dello schema precedente e incollarlo in un file di testo. Salvare il file come SampleUpdateSchema.xml.

  3. Copiare il modello updategram precedente e incollarlo in un file di testo. Salvare il file come SampleUpdategram.xml nella stessa directory in cui è stato salvato SampleUpdateSchema.xml.

    Il percorso della directory specificato per lo schema di mapping (SampleUpdateSchema.xml) è relativo alla directory in cui viene salvato il modello. È possibile specificare anche un percorso assoluto, ad esempio:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  4. Creare e utilizzare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire il modello.

    Per altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.

Vedere anche

Considerazioni sulla sicurezza di Updategram (SQLXML 4.0)