DiffGram 示例 (SQLXML 4.0)

适用于:SQL ServerAzure SQL 数据库

本主题中的示例包括用于对数据库执行插入、更新和删除操作的多个 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>  

<在前面的>块中,有一个 <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 中, <未指定之前> 块, () 未标识任何现有数据库记录。 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> 块包含具有相同 ID 的相应 <Customer> 元素。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<> 块具有一个 <Order> 元素 (dffgr:id=“Order1”) 和一个 <Customer> 元素 (diffgr:id=“Customer1”) ,其 DataInstance> 块 (<) 没有相应的元素。 这指示一个删除操作,将从 Cust 表和 Ord 表中删除记录。

  • before<> 块具有一个 <Customer> 元素 (diffgr:id=“Customer2”) ,其 DataInstance> 块 (<具有相同 ID) 的 Customer<> 元素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”) 前块中<>没有相应的元素。 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>  

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