DiffGram 示例 (SQLXML 4.0)

本主题中的示例包括执行数据库插入、更新和删除作的 DiffGrams。 使用示例之前,请注意以下事项:

  • 这些示例使用两个表(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 保存在示例中使用的其他文件的同一文件夹中。

答: 使用 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>  

前面的<>块包含 <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 处理逻辑,前>块映射中的所有<顶级元素都映射到相应的表,如映射架构中所述。

  • 前<>块具有 <Order> 元素(dffgr:id=“Order1”)和 <Customer> 元素(diffgr:id=“Customer1”),其中 DataInstance> 块中<没有相应的元素(具有相同 ID)。 这表示删除作,记录将从 Cust 和 Ord 表中删除。

  • 前<>块具有 <Customer> 元素(diffgr:id=“Customer2”),DataInstance> 块中<存在相应的 <Customer> 元素(具有相同 ID)。 DataInstance> 块中的<元素指定 diffgr:hasChanges=“modified”。 这是客户 ANATR 的更新作,在 Cust 表中使用 DataInstance> 块中指定的<值更新 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 块之前>指定的<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 指定删除作,因为只有前>一个<块。 在 DiffGram 中, parentID 批注用于指定订单和订单详细信息之间的父子关系。 SQLXML 删除记录时,它会从由此关系标识的子表中删除记录,然后从相应的父表中删除记录。