在 updategram 中指定带批注的映射架构 (SQLXML 4.0)

本主题说明如何使用在 updategram 中指定的映射架构(XSD 或 XDR)来处理更新。在 updategram 中,您可以提供将 updategram 中的元素和属性映射为 Microsoft SQL Server 中的表和列所使用的带批注的映射架构的名称。在 updategram 中指定映射架构时,updategram 中指定的元素和属性名称必须映射为该映射架构的元素和属性。

若要指定映射架构,请使用 <sync> 元素的 mapping-schema 属性。以下示例显示两个 updategram:其中一个使用简单映射架构,而另一个使用较复杂的架构。

注意注意

本文档假定您熟悉 SQL Server 中的模板和映射架构支持。有关详细信息,请参阅 带批注的 XSD 架构简介 (SQLXML 4.0)。有关使用 XDR 的早期应用程序,请参阅带批注的 XDR 架构(在 SQLXML 4.0 中不推荐使用)

处理数据类型

如果架构使用 sql:datatype 指定了 image、binary 或 varbinarySQL Server 数据类型,但未指定 XML 数据类型,updategram 则假定 XML 数据类型为 binary base 64。如果数据类型为 bin.base,则必须显式指定类型(dt:type=bin.base 或 type="xsd:hexBinary")。

如果架构指定了 dateTime、date 或 time XSD 数据类型,则还必须使用 sql:datatype="dateTime" 指定对应的 SQL Server 数据类型。

当处理 SQL Servermoney 类型的参数时,必须在映射架构中的相应节点上显式指定 sql:datatype="money"。

示例

若要创建使用以下示例的工作示例,则必须满足运行 SQLXML 示例的要求 中指定的要求。

A. 创建采用简单映射架构的 Updategram

以下 XSD 架构 (SampleSchema.xml) 是将 <Customer> 元素映射为 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>

以下 updategram 在 Sales.Customer 表中插入一条记录,并使用前面的映射架构将此数据正确映射到表。请注意,updategram 使用与在架构中定义的元素名称相同的元素名称,即 <Customer>。这是强制性的,因为 updategram 会指定特定的架构。

测试 updategram

  1. 复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 SampleUpdateSchema.xml。

  2. 复制下面的 updategram 模板,然后将其粘贴到文本文件中。在您保存 SampleUpdateSchema.xml 的相同目录中将文件另存为 SampleUpdategram.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>
    

    为映射架构 (SampleUpdateSchema.xml) 指定的目录路径是相对于模板保存目录的相对路径。也可以指定绝对路径,例如:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
    
  3. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。

    有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询

以下是等效的 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. 使用在映射架构中指定的父子关系插入记录

架构元素可以相互关联。<sql:relationship> 元素指定各架构元素之间的父子关系。此信息用于更新具有主键/外键关系的相应表。

以下映射架构 (SampleSchema.xml) 由 <Order><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>

以下 updategram 使用此 XSD 架构为订单 43860 添加新的订单详细记录(<after> 块中的 <OD> 元素)。mapping-schema 属性用于指定 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>

测试 updategram

  1. 复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 SampleUpdateSchema.xml。

  2. 复制上面的 Updategram 模板,并将它粘贴到文本文件中。在您保存 SampleUpdateSchema.xml 的相同目录中将文件另存为 SampleUpdategram.xml。

    为映射架构 (SampleUpdateSchema.xml) 指定的目录路径是相对于模板保存目录的相对路径。也可以指定绝对路径,例如:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
    
  3. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。

    有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询

以下是等效的 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. 使用在 XSD 架构中指定的父子关系和反转批注插入记录

此示例说明 updategram 逻辑如何使用在 XSD 中指定的父子关系来处理更新以及如何使用 inverse 批注。有关 inverse 批注的详细信息,请参阅在 sql:relationship 上指定 sql:inverse 属性 (SQLXML 4.0)

此示例假定 tempdb 数据库中具有以下表:

  • Cust (CustomerID, CompanyName),其中 CustomerID 为主键。

  • Ord (OrderID, CustomerID),其中 CustomerID 是引用 Cust 表中的 CustomerID 主键的外键。

updategram 使用以下 XSD 架构将记录插入到 Cust 和 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>

此示例中的 XSD 架构包含 <Customer><Order> 元素,并指定这两个元素之间存在父子关系。该结构将 <Order> 标识为父元素,将 <Customer> 标识为子元素。

updategram 处理逻辑使用父子关系相关信息来确定将记录插入到表中的顺序。在本示例中,updategram 逻辑首先尝试向 Ord 表插入记录(因为 <Order> 为父级),然后再尝试向 Cust 表插入记录(因为 <Customer> 为子级)。但是,鉴于数据库表架构中包含的主键/外键信息,此插入操作将导致在数据库中的外键冲突,继而导致插入失败。

若要指示 updategram 逻辑在更新操作期间反转父子关系,请针对 <relationship> 元素指定 inverse 批注。这会导致首先向 Cust 表添加记录,然后再向 Ord 表添加记录,并且该操作将成功。

以下 updategram 使用指定的 XSD 架构向 Ord 表插入订单 (OrderID=2),并向 Cust 表插入客户 (CustomerID='AAAAA'):

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

测试 updategram

  1. 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. 复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 SampleUpdateSchema.xml。

  3. 复制上面的 Updategram 模板,并将它粘贴到文本文件中。在您保存 SampleUpdateSchema.xml 的相同目录中将文件另存为 SampleUpdategram.xml。

    为映射架构 (SampleUpdateSchema.xml) 指定的目录路径是相对于模板保存目录的相对路径。也可以指定绝对路径,例如:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
    
  4. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。

    有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询