Udostępnij przez


Określanie adnotacjami mapowanie schematu w Updategram (SQLXML 4.0)

W tym temacie wyjaśniono, jak schemat mapowania (XSD lub XDR) określonego w updategram jest używane do przetwarzania aktualizacji.In an updategram, you can provide the name of an annotated mapping schema to use in mapping the elements and attributes in the updategram to tables and columns in Microsoft SQL Server.Jeśli określono mapowania schematu w updategram, nazwy elementów i atrybut, które są określone w updategram musi być mapowana na elementy i atrybuty w schemacie mapowania.

Aby określić mapowanie schematu, należy użyć mapping-schema atrybut <sync> element. Następujące przykłady przedstawiają dwóch updategrams: taki, który używa schematu mapowania proste i taką, która korzysta z bardziej złożonych schematu.

Uwaga

W tej dokumentacji zakłada się, że czytelnik jest obeznany z szablonów i mapowanie schematu nie obsługuje w SQL Server. Aby uzyskać więcej informacji zobaczWprowadzenie do adnotacjami schematy XSD (SQLXML 4.0).W przypadku starszych aplikacji, które używają XDR zobacz Adnotacjami schematy XDR (zaniechana w SQLXML 4.0).

Postępowanie z typami danych

If the schema specifies the image, binary, or varbinarySQL Server data type (by using sql:datatype) and does not specify an XML data type, the updategram assumes that the XML data type is binary base 64.Jeżeli dane pochodzą z bin.base Typ, należy jawnie określić typ (dt:type=bin.base lub type="xsd:hexBinary").

Jeśli schemat określa dateTime, date, lub time Typ danych XSD, należy także określić odpowiednie SQL Server Typ danych przy użyciu sql:datatype="dateTime".

When handling parameters of SQL Servermoney type, you must explicitly specify sql:datatype="money" on the appropriate node in the mapping schema.

Przykłady

Aby utworzyć próbek pracy przy użyciu poniższych przykładach, musi spełniać wymagania określone w Wymagania dotyczące uruchamianie SQLXML przykłady.

A.Tworzenie updategram ze schematem mapowania proste

Następujące schematu XSD (SampleSchema.xml) jest schemat mapowania, która mapuje <Odbiorcy> element w tabela 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>

Następujące updategram wstawia rekordu do tabela Sales.Customer i opiera się na poprzedni schemat mapowania, aby prawidłowo zamapować te dane do tabela.Należy zauważyć, że updategram używa tej samej nazwie elementu <Odbiorcy>, zgodnie z definicją w schemacie. Jest to konieczne, ponieważ updategram określa określonego schematu.

Aby przetestować updategram

  1. Skopiować powyższy kod schematu i wkleić go do pliku tekstowego.Zapisz plik jako SampleUpdateSchema.xml.

  2. Szablonu updategram poniżej skopiować i wkleić go do pliku tekstowego.Zapisz plik jako SampleUpdategram.xml w tym samym katalogu, w którym zapisano 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>
    

    To ścieżka do katalogu określonego dla mapowania schematu (SampleUpdateSchema.xml) jest względna w stosunku do katalogu, w którym są zapisywane w szablonie.Ścieżka bezwzględna również można określić, na przykład:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
    
  3. Tworzenie i używanie skryptu testu 4.0 SQLXML (Sqlxml4test.vbs) do wykonać tego szablonu.

    Aby uzyskać więcej informacji zobaczPrzy użyciu obiektu ADO do wykonywania SQLXML bada 4.0.

Jest to równoważne schematu XDR:

<?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.Wstawianie rekordu za pomocą relacji nadrzędny podrzędność, określona w schemacie mapowania

Elementy schematu mogą zostać objęte relacją.The <sql:relationship> element specifies the parent-podrzędność relationship between the schema elements. Te informacje są używane do aktualizowania odpowiednich tabel relacją podstawowy klucz/klucz obcy.

Następujące schematu mapowania (SampleSchema.xml) składa się z dwóch elementów <Zamówienia> i <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>

Aby dodać nowego zamówienia szczegółów rekordu (an updategram następujące używa tego schematu XSD <OD> element <after> Zablokuj) dla zamówienia 43860. The mapping-schema atrybut is used to specify the mapping schema in the 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>

Aby przetestować updategram

  1. Skopiować powyższy kod schematu i wkleić go do pliku tekstowego.Zapisz plik jako SampleUpdateSchema.xml.

  2. Powyżej szablonu updategram skopiować i wkleić go do pliku tekstowego.Zapisz plik jako SampleUpdategram.xml w tym samym katalogu, w którym zapisano SampleUpdateSchema.xml.

    To ścieżka do katalogu określonego dla mapowania schematu (SampleUpdateSchema.xml) jest względna w stosunku do katalogu, w którym są zapisywane w szablonie.Ścieżka bezwzględna również można określić, na przykład:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
    
  3. Tworzenie i używanie skryptu testu 4.0 SQLXML (Sqlxml4test.vbs) do wykonać tego szablonu.

    Aby uzyskać więcej informacji zobaczPrzy użyciu obiektu ADO do wykonywania SQLXML bada 4.0.

Jest to równoważne schematu XDR:

<?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.Wstawianie rekordu za pomocą adnotacji relacji i odwrotności nadrzędny podrzędność określona w schemacie XSD

Ten przykład ilustruje, jak logiki updategram używa relacji nadrzędny podrzędność, określone w XSD w celu przetwarzania aktualizacji, w jaki sposób inverse Adnotacja jest używany. Aby uzyskać więcej informacji na temat inverse adnotacji, zobacz Określanie sql:inverse atrybut na sql:relationship (SQLXML 4.0).

W tym przykładzie przyjęto założenie, że w poniższych tabelach znajdują się w tempdb bazy danych:

  • Cust (CustomerID, CompanyName), gdzie CustomerID jest to klucz podstawowy

  • Ord (OrderID, CustomerID), gdzie CustomerID jest klucz obcy, która odwołuje się do CustomerID klucz podstawowy w Cust Tabela.

The updategram używa następującego schematu XSD wstawić rekordów do tabel Cust i zakupu:

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

Ma schematu XSD, w tym przykładzie <Odbiorcy> i <Zamówienia> elementy, a określa relacji nadrzędny podrzędność między dwoma elementami. Identyfikuje <Zamówienia> jako elementu nadrzędnego i <Odbiorcy> jako element podrzędność.

Updategram, przetwarzanie logiki używa informacji o relacji nadrzędny podrzędność do określenia kolejności, w którym rekordy są wstawiane do tabeli.W tym przykładzie logiki updategram najpierw podejmie próbę wstawienia rekordu w tabela zakupu (ponieważ <Zamówienia> jest elementem nadrzędnym) i nie spróbuje wstawić rekord do tabela Cust (ponieważ <Odbiorcy> jest elementem podrzędnym). Jednak z powodu podstawowego klucza i obcego klucza informacje zawarte w schematu tabela bazy danych, to operacja wstawiania powoduje naruszenie klucz obcy w bazie danych i insert nie powiedzie się.

Aby nakazać logiki updategram odwrócić relacji nadrzędny podrzędność podczas operacji aktualizacji inverse Adnotacja jest określona na <Relacja> element. Dzięki temu rekordy są dodawane jako pierwsze w tabela Cust, a następnie w tabela zakupu, a operacja powiedzie się.

Następujące updategram wstawia zamówienia (IDZamówienia = 2) w tabela zakupu oraz klienta (IDKlienta = "AAAAA") w tabela Cust przy użyciu określonego schematu XSD:

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

Aby przetestować updategram

  1. Tworzenie tych tabel w tempdb bazy danych:

    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. Skopiować powyższy kod schematu i wkleić go do pliku tekstowego.Zapisz plik jako SampleUpdateSchema.xml.

  3. Powyżej szablonu updategram skopiować i wkleić go do pliku tekstowego.Zapisz plik jako SampleUpdategram.xml w tym samym katalogu, w którym zapisano SampleUpdateSchema.xml.

    To ścieżka do katalogu określonego dla mapowania schematu (SampleUpdateSchema.xml) jest względna w stosunku do katalogu, w którym są zapisywane w szablonie.Ścieżka bezwzględna również można określić, na przykład:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
    
  4. Tworzenie i używanie skryptu testu 4.0 SQLXML (Sqlxml4test.vbs) do wykonać tego szablonu.

    Aby uzyskać więcej informacji zobaczPrzy użyciu obiektu ADO do wykonywania SQLXML bada 4.0.