Поделиться через


Примеры 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 в этом примере удаляет запись клиента (customerID — ALFKI) из таблицы Cust и удаляет соответствующую запись заказа (1) из таблицы 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/>  
  
    <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".

В. Вставка записи с помощью 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".

С. Обновление существующей записи с помощью DiffGram

В этом примере DiffGram обновляет сведения о клиентах (CompanyName и ContactName) для клиента ALFKI.

<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> включает соответствующий <элемент Customer> с тем же идентификатором. Элемент <клиента> в <NewDataSet> также указывает 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".

Д. Вставка, обновление и удаление записей с помощью 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 есть <элемент Order (dffgr:id="Order1>") и <элемент Customer> (diffgr:id="Customer1"), для которого отсутствует соответствующий элемент в<блоке DataInstance> (с тем же идентификатором). Это означает операцию удаления, а записи удаляются из таблиц Cust и Ord.

  • >Перед< блоком <имеется элемент Customer (diffgr:id="Customer2>"), для которого в блоке DataInstance> (с таким же идентификатором есть соответствующий элемент< Customer>).< Элемент в блоке <DataInstance> указывает diffgr:hasChanges="modified". Это операция обновления, в которой для клиента ANATR данные CompanyName и ContactName обновляются в таблице Cust с использованием значений, указанных в блоке <DataInstance> .

  • Блок <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".

Е. Применение обновлений с помощью DiffGram с заметкой diffgr:parentID

В этом примере показано, как при применении обновлений используется заметка parentID, указанная в<> блоке DiffGram.

<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 удаляет записи из дочерней таблицы, которая определяется этой связью, а затем удаляет записи из соответствующей родительской таблицы.