DiffGram 示例 (SQLXML 4.0)

本主题中的示例包括用于对数据库执行插入、更新和删除操作的多个 DiffGram。在使用这些示例前,请注意以下事项:

  • 示例中使用两个表(Cust 和 Ord);要测试 DiffGram 示例,必须创建这两个表:

    Cust(CustomerID, CompanyName, ContactName)
    Ord(OrderID, CustomerID)
    
  • 本主题中的多数示例都使用以下 XSD 架构:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
    
    <xsd:annotation>
      <xsd:documentation>
        Diffgram Customers/Orders Schema.
      </xsd:documentation>
      <xsd:appinfo>
           <sql:relationship name="CustomersOrders" 
                      parent="Cust"
                      parent-key="CustomerID"
                      child-key="CustomerID"
                      child="Ord"/>
      </xsd:appinfo>
    </xsd:annotation>
    
    <xsd:element name="Customer" sql:relation="Cust">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="CompanyName"    type="xsd:string"/>
          <xsd:element name="ContactName"    type="xsd:string"/>
           <xsd:element name="Order" sql:relation="Ord" sql:relationship="CustomersOrders">
            <xsd:complexType>
              <xsd:attribute name="OrderID" type="xsd:int" sql:field="OrderID"/>
              <xsd:attribute name="CustomerID" type="xsd:string"/>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="CustomerID" type="xsd:string" sql:field="CustomerID"/>
      </xsd:complexType>
    </xsd:element>
    
    </xsd:schema>   
    

    将此架构另存为 DiffGramSchema.xml,并与示例中所用的其他文件保存在相同的文件夹中。

A. 使用 DiffGram 删除记录

本示例中的 DiffGram 从 Cust 表中删除一条客户记录(CustomerID 为 ALFKI),并且从 Ord 表中删除相应的订单记录(OrderID 为 1)。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" sql:mapping-schema="DiffGramSchema.xml">
  <diffgr:diffgram 
           xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
           xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <DataInstance/>

    <diffgr:before>
        <Order diffgr:id="Order1" 
               msdata:rowOrder="0" 
               CustomerID="ALFKI" 
               OrderID="1"/>
        <Customer diffgr:id="Customer1" 
                  msdata:rowOrder="0" 
                  CustomerID="ALFKI">
           <CompanyName>Alfreds Futterkiste</CompanyName>
           <ContactName>Maria Anders</ContactName>
        </Customer>
    </diffgr:before>
    <msdata:errors/>
  </diffgr:diffgram>
</ROOT>

<before> 块中,存在一个 <Order> 元素 (diffgr:id="Order1") 和一个 <Customer> 元素 (diffgr:id="Customer1")。这些元素表示数据库中的现有记录。<DataInstance> 元素不具有相应的记录(具有相同的 diffgr:id)。这指示一个删除操作。

测试 DiffGram

  1. tempdb 数据库中创建以下表。

    CREATE TABLE Cust(
            CustomerID  nchar(5) Primary Key,
            CompanyName nvarchar(40) NOT NULL ,
            ContactName nvarchar(60) NULL)
    GO
    
    CREATE TABLE Ord(
       OrderID    int Primary Key,
       CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID))
    GO
    
  2. 添加以下示例数据:

    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ALFKI', N'Alfreds Futterkiste', N'Maria Anders')
    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ANATR', N'Ana Trujillo Emparedados y helados', N'Ana Trujillo')
    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ANTON', N'Antonio Moreno Taquería', N'Antonio Moreno')
    
    INSERT INTO Ord(OrderID, CustomerID) VALUES(1, N'ALFKI')
    INSERT INTO Ord(OrderID, CustomerID) VALUES(2, N'ANATR')
    INSERT INTO Ord(OrderID, CustomerID) VALUES(3, N'ANTON')
    
  3. 复制上面的 DiffGram,并将它粘贴到文本文件中。在上一步所使用的文件夹中将该文件另存为 MyDiffGram.xml。

  4. 复制本主题上文所提供的 DiffGramSchema,并将其粘贴到文本文件中。将该文件另存为 DiffGramSchema.xml。

  5. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行 DiffGram。

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

B. 使用 DiffGram 插入记录

在本示例中,DiffGram 在 Cust 表和 Ord 表中各插入一条记录。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" 
      sql:mapping-schema="DiffGramSchema.xml">
  <diffgr:diffgram 
          xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
          xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <DataInstance>
       <Customer diffgr:id="Customer1" msdata:rowOrder="0"  
                 diffgr:hasChanges="inserted" CustomerID="ALFKI">
        <CompanyName>C3Company</CompanyName>
        <ContactName>C3Contact</ContactName>
        <Order diffgr:id="Order1" 
               msdata:rowOrder="0"
               diffgr:hasChanges="inserted" 
               CustomerID="ALFKI" OrderID="1"/>
      </Customer>
    </DataInstance>

  </diffgr:diffgram>
</ROOT>

在这个 DiffGram 中,未指定 <before> 块(未标识现有数据库记录)。有两个记录实例(由 <DataInstance> 块中的 <Customer><Order> 元素标识)分别映射到 Cust 表和 Ord 表。这两个元素都指定了 diffgr:hasChanges 属性 (hasChanges="inserted")。这指示一个插入操作。在这个 DiffGram 中,如果指定 hasChanges="modified",则指示您希望修改不存在的记录,这将导致错误。

测试 DiffGram

  1. tempdb 数据库中创建以下表。

    CREATE TABLE Cust(
            CustomerID  nchar(5) Primary Key,
            CompanyName nvarchar(40) NOT NULL ,
            ContactName nvarchar(60) NULL)
    GO
    
    CREATE TABLE Ord(
       OrderID    int Primary Key,
       CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID))
    GO
    
  2. 添加以下示例数据:

    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ALFKI', N'Alfreds Futterkiste', N'Maria Anders')
    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ANATR', N'Ana Trujillo Emparedados y helados', N'Ana Trujillo')
    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ANTON', N'Antonio Moreno Taquería', N'Antonio Moreno')
    
    INSERT INTO Ord(OrderID, CustomerID) VALUES(1, N'ALFKI')
    INSERT INTO Ord(OrderID, CustomerID) VALUES(2, N'ANATR')
    INSERT INTO Ord(OrderID, CustomerID) VALUES(3, N'ANTON')
    
  3. 复制上面的 DiffGram,并将它粘贴到文本文件中。在上一步所使用的文件夹中将该文件另存为 MyDiffGram.xml。

  4. 复制本主题上文所提供的 DiffGramSchema,并将其粘贴到文本文件中。将该文件另存为 DiffGramSchema.xml。

  5. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行 DiffGram。

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

C. 使用 DiffGram 更新现有记录

在本示例中,DiffGram 更新客户 ALFKI 的客户信息(CompanyName 和 ContactName)。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" sql:mapping-schema="DiffGramSchema.xml">
  <diffgr:diffgram 
           xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
           xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <DataInstance>
      <Customer diffgr:id="Customer1" 
                msdata:rowOrder="0" diffgr:hasChanges="modified" 
                CustomerID="ALFKI">
          <CompanyName>Bottom Dollar Markets</CompanyName>
          <ContactName>Antonio Moreno</ContactName>
      </Customer>
    </DataInstance>

    <diffgr:before>
     <Customer diffgr:id="Customer1" 
               msdata:rowOrder="0" 
               CustomerID="ALFKI">
        <CompanyName>Alfreds Futterkiste</CompanyName>
        <ContactName>Maria Anders</ContactName>
      </Customer>
    </diffgr:before>

  </diffgr:diffgram>
</ROOT>

<before> 块包括 <Customer> 元素 (diffgr:id="Customer1")。<DataInstance> 块包括相应的 <Customer> 元素,并且具有相同的 id<NewDataSet> 中的 <customer> 元素还指定了 diffgr:hasChanges="modified"。这指示一个更新操作,Cust 表中的客户记录将相应更新。请注意,如果未指定 diffgr:hasChanges 属性,DiffGram 处理逻辑将忽略此元素并且不执行任何更新。

测试 DiffGram

  1. tempdb 数据库中创建以下表。

    CREATE TABLE Cust(
            CustomerID  nchar(5) Primary Key,
            CompanyName nvarchar(40) NOT NULL ,
            ContactName nvarchar(60) NULL)
    GO
    
    CREATE TABLE Ord(
       OrderID    int Primary Key,
       CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID))
    GO
    
  2. 添加以下示例数据:

    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ALFKI', N'Alfreds Futterkiste', N'Maria Anders')
    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ANATR', N'Ana Trujillo Emparedados y helados', N'Ana Trujillo')
    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ANTON', N'Antonio Moreno Taquería', N'Antonio Moreno')
    
    INSERT INTO Ord(OrderID, CustomerID) VALUES(1, N'ALFKI')
    INSERT INTO Ord(OrderID, CustomerID) VALUES(2, N'ANATR')
    INSERT INTO Ord(OrderID, CustomerID) VALUES(3, N'ANTON')
    
  3. 复制上面的 DiffGram,并将它粘贴到文本文件中。在上一步所使用的文件夹中将该文件另存为 MyDiffGram.xml。

  4. 复制本主题上文所提供的 DiffGramSchema,并将其粘贴到文本文件中。将该文件另存为 DiffGramSchema.xml。

  5. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行 DiffGram。

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

D. 使用 DiffGram 插入、更新和删除记录

在本示例中,使用一个较为复杂的 DiffGram 执行插入、更新和删除操作。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" sql:mapping-schema="DiffGramSchema.xml">
  <diffgr:diffgram 
         xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
         xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <DataInstance>
      <Customer diffgr:id="Customer2" msdata:rowOrder="1" 
                diffgr:hasChanges="modified" 
                CustomerID="ANATR">
          <CompanyName>Bottom Dollar Markets</CompanyName>
          <ContactName>Elizabeth Lincoln</ContactName>
          <Order diffgr:id="Order2" msdata:rowOrder="1" 
               msdata:hiddenCustomerID="ANATR" 
               CustomerID="ANATR" OrderID="2"/>
      </Customer>

      <Customer diffgr:id="Customer3" msdata:rowOrder="2" 
                CustomerID="ANTON">
         <CompanyName>Chop-suey Chinese</CompanyName>
         <ContactName>Yang Wang</ContactName>
         <Order diffgr:id="Order3" msdata:rowOrder="2" 
               msdata:hiddenCustomerID="ANTON" 
               CustomerID="ANTON" OrderID="3"/>
      </Customer>
      <Customer diffgr:id="Customer4" msdata:rowOrder="3" 
                diffgr:hasChanges="inserted" 
                CustomerID="AROUT">
         <CompanyName>Around the Horn</CompanyName>
         <ContactName>Thomas Hardy</ContactName>
         <Order diffgr:id="Order4" msdata:rowOrder="3" 
                diffgr:hasChanges="inserted" 
                msdata:hiddenCustomerID="AROUT" 
               CustomerID="AROUT" OrderID="4"/>
      </Customer>
    </DataInstance>
    <diffgr:before>
      <Order diffgr:id="Order1" msdata:rowOrder="0" 
             msdata:hiddenCustomerID="ALFKI" 
             CustomerID="ALFKI" OrderID="1"/>
      <Customer diffgr:id="Customer1" msdata:rowOrder="0" 
                CustomerID="ALFKI">
        <CompanyName>Alfreds Futterkiste</CompanyName>
        <ContactName>Maria Anders</ContactName>
      </Customer>
      <Customer diffgr:id="Customer2" msdata:rowOrder="1" 
                CustomerID="ANATR">
        <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>
        <ContactName>Ana Trujillo</ContactName>
      </Customer>
    </diffgr:before>
  </diffgr:diffgram>
</ROOT>

DiffGram 逻辑按如下方式处理此 DiffGram:

  • 根据 DiffGram 处理逻辑,<before> 块中的所有顶级元素都映射到相应的表,如映射架构中所述。

  • <before> 块具有一个 <Order> 元素 (dffgr:id="Order1") 和一个 <Customer> 元素 (diffgr:id="Customer1"),这两个元素在 <DataInstance> 块中没有相应的元素(具有相同的 ID)。这指示一个删除操作,将从 Cust 表和 Ord 表中删除记录。

  • <before> 块具有 <Customer> 元素 (diffgr:id="Customer2"),这个元素在 <DataInstance> 块中具有相应的 <Customer> 元素(具有相同的 ID)。<DataInstance> 块中的元素指定 diffgr:hasChanges="modified"。这是一个更新操作,其中针对客户 ANATR,使用 <DataInstance> 块中指定的值更新了 Cust 表中的 CompanyName 和 ContactName 信息。

  • <DataInstance> 块具有一个 <Customer> 元素 (diffgr:id="Customer3") 和一个 <Order> 元素 (diffgr:id="Order3")。这两个元素均未指定 diffgr:hasChanges 属性。因此,DiffGram 处理逻辑将忽略这些元素。

  • <DataInstance> 块具有一个 <Customer> 元素 (diffgr:id="Customer4") 和一个 <Order> 元素 (diffgr:id="Order4"),这两个元素在 <before> 块中都没有相应元素。<DataInstance> 块中的这些元素指定 diffgr:hasChanges="inserted"。因此,将在 Cust 表和 Ord 表中添加一条新记录。

测试 DiffGram

  1. tempdb 数据库中创建以下表。

    CREATE TABLE Cust(
            CustomerID  nchar(5) Primary Key,
            CompanyName nvarchar(40) NOT NULL ,
            ContactName nvarchar(60) NULL)
    GO
    
    CREATE TABLE Ord(
       OrderID    int Primary Key,
       CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID))
    GO
    
  2. 添加以下示例数据:

    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ALFKI', N'Alfreds Futterkiste', N'Maria Anders')
    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ANATR', N'Ana Trujillo Emparedados y helados', N'Ana Trujillo')
    INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES
         (N'ANTON', N'Antonio Moreno Taquería', N'Antonio Moreno')
    
    INSERT INTO Ord(OrderID, CustomerID) VALUES(1, N'ALFKI')
    INSERT INTO Ord(OrderID, CustomerID) VALUES(2, N'ANATR')
    INSERT INTO Ord(OrderID, CustomerID) VALUES(3, N'ANTON')
    
  3. 复制上面的 DiffGram,并将它粘贴到文本文件中。在上一步所使用的文件夹中将该文件另存为 MyDiffGram.xml。

  4. 复制本主题上文所提供的 DiffGramSchema,并将其粘贴到文本文件中。将该文件另存为 DiffGramSchema.xml。

  5. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行 DiffGram。

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

E. 通过使用带有 diffgr:parentID 批注的 DiffGram 应用更新

此示例说明如何在应用更新时使用在 DiffGram 的 <before> 块中指定的 parentID 批注。

<NewDataSet />
<diffgr:before>
   <Order diffgr:id="Order1" msdata:rowOrder="0" OrderID="2" />
   <Order diffgr:id="Order3" msdata:rowOrder="2" OrderID="4" />

   <OrderDetail diffgr:id="OrderDetail1" 
                diffgr:parentId="Order1" 
                msdata:rowOrder="0" 
                ProductID="13" 
                OrderID="2" />
   <OrderDetail diffgr:id="OrderDetail3" 
                diffgr:parentId="Order3"
                ProductID="77"
                OrderID="4"/>
</diffgr:before>
</diffgr:diffgram>

由于只有一个 <before> 块,所以此 DiffGram 指定的是删除操作。在 DiffGram 中,parentID 批注用于指定订单之间的父子关系以及订单明细。当 SQLXML 删除记录时,它先从此关系标识的子表中删除记录,然后从相应的父表中删除记录。