在 updategram 中指定带批注的映射架构 (SQLXML 4.0)
本主题说明如何使用在 updategram 中指定的映射架构(XSD 或 XDR)来处理更新。 在 updategram 中,可以提供批注映射架构的名称,用于将 updategram 中的元素和属性映射到 Microsoft SQL Server 中的表和列。 在 updategram 中指定映射架构时,updategram 中指定的元素和属性名称必须映射为该映射架构的元素和属性。
若要指定映射架构,请使用同步>元素的 <mapping-schema 属性。 以下示例显示两个 updategram:其中一个使用简单映射架构,而另一个使用较复杂的架构。
注意
本文档假定你熟悉 SQL Server 中的模板和映射架构支持。 有关详细信息,请参阅带批注的 XSD 架构简介(SQLXML 4.0)。 有关使用 XDR 的旧版应用程序,请参阅带批注的 XDR 架构(SQLXML 4.0 中已弃用)。
处理数据类型
如果架构指定映像、二进制或 varbinarySQL Server 数据类型(使用 sql:datatype),并且未指定 XML 数据类型,则 updategram 假定 XML 数据类型是二进制基 64。 如果数据为 bin.base 类型,则必须显式指定类型(dt:type=bin.base 或 type=“xsd:hexBinary”)。
如果架构指定 dateTime、 date 或 time XSD 数据类型,则还必须使用 sql:datatype=“dateTime”指定相应的 SQL Server 数据类型。
处理 SQL Server 货币类型的参数时,必须在映射架构中的相应节点上显式指定 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
复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 SampleUpdateSchema.xml。
复制下面的 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"
创建并使用 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 添加新订单详细信息记录(<后>块中的 <OD> 元素)。 映射架构属性用于在 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
复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 SampleUpdateSchema.xml。
复制上面的 Updategram 模板,并将它粘贴到文本文件中。 在您保存 SampleUpdateSchema.xml 的相同目录中将文件另存为 SampleUpdategram.xml。
为映射架构 (SampleUpdateSchema.xml) 指定的目录路径是相对于模板保存目录的相对路径。 也可以指定绝对路径,例如:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
创建并使用 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 中指定的父子关系来处理更新,以及 如何使用反向 批注。 有关反向批注的详细信息,请参阅指定 sql:relationship 上的 sql:inverse 属性(SQLXML 4.0)。
此示例假定以下表位于 tempdb 数据库中:
Cust (CustomerID, CompanyName)
,其中CustomerID
为主键。Ord (OrderID, CustomerID)
,其中CustomerID
是引用CustomerID
表中的Cust
主键的外键。
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 逻辑在更新操作期间反转父子关系,在关系>元素上<指定反转批注。 这会导致首先向 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
在 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
复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 SampleUpdateSchema.xml。
复制上面的 Updategram 模板,并将它粘贴到文本文件中。 在您保存 SampleUpdateSchema.xml 的相同目录中将文件另存为 SampleUpdategram.xml。
为映射架构 (SampleUpdateSchema.xml) 指定的目录路径是相对于模板保存目录的相对路径。 也可以指定绝对路径,例如:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询。