Delen via


Het specificeren van een geannoteerd mappingschema in een updategram (SQLXML 4.0)

Van toepassing op:SQL ServerAzure SQL Database

Dit onderwerp legt uit hoe het mappingschema (XSD of XDR) dat in een updategram is gespecificeerd, wordt gebruikt om de updates te verwerken. In een updategram kun je de naam van een geannoteerd mappingschema geven om te gebruiken bij het mappen van de elementen en attributen in het updategram naar tabellen en kolommen in Microsoft SQL Server. Wanneer een mappingschema wordt gespecificeerd in een updategram, moeten de element- en attribuutnamen die in het updategram zijn gespecificeerd, worden gekoppeld aan de elementen en attributen in het mappingschema.

Om een mapping-schema te specificeren, gebruik je het mapping-schema-attribuut van het <sync-element> . De volgende voorbeelden tonen twee updategrammen: één die een eenvoudig mappingschema gebruikt, en één die een complexer schema gebruikt.

Opmerking

Deze documentatie gaat ervan uit dat je bekend bent met sjablonen en mapping schema-ondersteuning in SQL Server. Voor meer informatie, zie Inleiding tot Geannoteerde XSD-schema's (SQLXML 4.0). Voor legacy-applicaties die XDR gebruiken, zie Annotated XDR Schemas (Deprecated in SQLXML 4.0).

Omgaan met datatypen

Als het schema het afbeeldings-, binaire of varbinaireSQL Server-datatype specificeert (door sql :datatype te gebruiken) en geen XML-datatype specificeert, gaat het updategram ervan uit dat het XML-datatype binair basis 64 is. Als je data bin.base type is, moet je expliciet het type specificeren (dt:type=bin.base of type="xsd:hexBinary").

Als het schema het dataTime, de datum of tijd XSD-datatype specificeert, moet je ook het bijbehorende SQL Server-datatype opgeven door sql:datatype="dateTime" te gebruiken.

Bij het omgaan met parameters van het SQL Server-geldtype , moet je expliciet sql:datatype="money" specificeren op de juiste node in het mappingschema.

Voorbeelden

Als u werkvoorbeelden wilt maken met behulp van de volgende voorbeelden, moet u voldoen aan de vereisten die zijn opgegeven in Vereisten voor het uitvoeren van SQLXML-voorbeelden.

Eén. Een updategram maken met een eenvoudig mappingschema

Het volgende XSD-schema (SampleSchema.xml) is een mappingschema dat het <Customer-element> koppelt aan de Sales.Customer-tabel:

<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>  

Het volgende updategram voegt een record in in de Sales.Customer-tabel en vertrouwt op het vorige mappingschema om deze gegevens correct aan de tabel toe te wijzen. Let op dat het updategram dezelfde elementnaam, <Customer>, gebruikt als gedefinieerd in het schema. Dit is verplicht omdat het updategram een bepaald schema specificeert.

Om het updategram te testen
  1. Kopieer de bovenstaande schemacode en plak deze in een tekstbestand. Sla het bestand op als SampleUpdateSchema.xml.

  2. Kopieer het updategram-sjabloon hieronder en plak het in een tekstbestand. Sla het bestand op als SampleUpdategram.xml in dezelfde map waar je SampleUpdateSchema.xmlhebt opgeslagen.

    <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>  
    

    Het directorypad dat voor het mappingschema (SampleUpdateSchema.xml) is gespecificeerd is relatief tot de map waar het sjabloon wordt opgeslagen. Een absoluut pad kan ook worden gespecificeerd, bijvoorbeeld:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. Maak het SQLXML 4.0 Test Script (Sqlxml4test.vbs) aan en gebruik het om het sjabloon uit te voeren.

    Zie ADO gebruiken om SQLXML 4.0-query's uit te voeren voor meer informatie.

Dit is het equivalente XDR-schema:

<?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. Een record invoegen door gebruik te maken van de ouder-kindrelatie die in het mappingschema is gespecificeerd

Schema-elementen kunnen gerelateerd zijn. Het <sql:relationship-element> specificeert de ouder-kindrelatie tussen de schema-elementen. Deze informatie wordt gebruikt om overeenkomstige tabellen bij te werken die een primaire sleutel/vreemde sleutel relatie hebben.

Het volgende mapping schema (SampleSchema.xml) bestaat uit twee elementen, <Order> en <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>  

Het volgende updategram gebruikt dit XSD-schema om een nieuw orderdetailrecord toe te voegen (een <OD-element> in het <achterste> blok) voor order 43860. Het mapping-schema-attribuut wordt gebruikt om het mapping-schema in het updategram te specificeren.

<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>  
Om het updategram te testen
  1. Kopieer de bovenstaande schemacode en plak deze in een tekstbestand. Sla het bestand op als SampleUpdateSchema.xml.

  2. Kopieer het bovenstaande updategram-sjabloon en plak het in een tekstbestand. Sla het bestand op als SampleUpdategram.xml in dezelfde map waar je SampleUpdateSchema.xmlhebt opgeslagen.

    Het directorypad dat voor het mappingschema (SampleUpdateSchema.xml) is gespecificeerd is relatief tot de map waar het sjabloon wordt opgeslagen. Een absoluut pad kan ook worden gespecificeerd, bijvoorbeeld:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. Maak het SQLXML 4.0 Test Script (Sqlxml4test.vbs) aan en gebruik het om het sjabloon uit te voeren.

    Zie ADO gebruiken om SQLXML 4.0-query's uit te voeren voor meer informatie.

Dit is het equivalente XDR-schema:

<?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. Een record invoegen door gebruik te maken van de ouder-kindrelatie en inverse annotatie zoals gespecificeerd in het XSD-schema

Dit voorbeeld illustreert hoe de updategram-logica de ouder-kindrelatie gebruikt die in de XSD is gespecificeerd om updates te verwerken, en hoe de inverse annotatie wordt gebruikt. Voor meer informatie over de inverse annotatie, zie Specificifying the sql:inverse Attribute on sql:relationship (SQLXML 4.0).

Dit voorbeeld gaat ervan uit dat de volgende tabellen in de tempdb-database staan:

  • Cust (CustomerID, CompanyName), waarbij CustomerID de primaire sleutel is

  • Ord (OrderID, CustomerID), waarbij CustomerID een vreemde sleutel is die verwijst naar de CustomerID primaire sleutel in de Cust tabel.

Het updategram gebruikt het volgende XSD-schema om records in de Cust- en Ord-tabellen in te voegen:

<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>  

Het XSD-schema in dit voorbeeld heeft <Klant-> en <Order-elementen> , en specificeert een ouder-kindrelatie tussen de twee elementen. Het identificeert <Order> als het ouderelement en <Customer> als het kindelement.

De updategramverwerkingslogica gebruikt de informatie over de ouder-kindrelatie om de volgorde te bepalen waarin records in tabellen worden ingevoegd. In dit voorbeeld probeert de updategram-logica eerst een record in de Ord-tabel in te voegen (omdat <Order> de ouder is) en vervolgens een record in de Cust-tabel (omdat <Customer> het kind is). Door de primaire sleutel/vreemde sleutel-informatie die in het databasetabelschema is opgenomen, veroorzaakt deze insert-operatie echter een vreemde sleutel-overtreding in de database en faalt de insert.

Om de updategramlogica te instrueren om de ouder-kindrelatie tijdens de updateoperatie om te keren, wordt de inverse annotatie op het <relatie-element> gespecificeerd. Als gevolg hiervan worden records eerst toegevoegd aan de Cust-tabel en daarna aan de Ord-tabel, en slaagt de bewerking.

Het volgende updategram voegt een order (OrderID=2) in de Ord-tabel en een klant (CustomerID='AAAAA') in de Cust-tabel door gebruik te maken van het gespecificeerde XSD-schema:

<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>  
Om het updategram te testen
  1. Maak deze tabellen aan in de tempdb-database :

    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. Kopieer de bovenstaande schemacode en plak deze in een tekstbestand. Sla het bestand op als SampleUpdateSchema.xml.

  3. Kopieer het bovenstaande updategram-sjabloon en plak het in een tekstbestand. Sla het bestand op als SampleUpdategram.xml in dezelfde map waar je SampleUpdateSchema.xmlhebt opgeslagen.

    Het directorypad dat voor het mappingschema (SampleUpdateSchema.xml) is gespecificeerd is relatief tot de map waar het sjabloon wordt opgeslagen. Een absoluut pad kan ook worden gespecificeerd, bijvoorbeeld:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  4. Maak het SQLXML 4.0 Test Script (Sqlxml4test.vbs) aan en gebruik het om het sjabloon uit te voeren.

    Zie ADO gebruiken om SQLXML 4.0-query's uit te voeren voor meer informatie.

Zie ook

Beveiligingsoverwegingen voor Updategram (SQLXML 4.0)