Ejemplos de DiffGram (SQLXML 4.0)

Los ejemplos de este tema incluyen de una serie de DiffGram que realizan operaciones de inserción, actualización y eliminación en la base de datos. Antes de usar los ejemplos, tenga en cuenta lo siguiente:

  • Los ejemplos usan dos tablas (Cust y Ord) que deberá crear si desea probar los ejemplos de DiffGram:

    Cust(CustomerID, CompanyName, ContactName)
    Ord(OrderID, CustomerID)
    
  • La mayoría de los ejemplos de este tema usan el siguiente esquema 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>   
    

    Guarde este esquema como DiffGramSchema.xml en la misma carpeta donde haya guardado los demás archivos que se utilizan en los ejemplos.

A. Eliminar un registro mediante un DiffGram

El DiffGram de este ejemplo elimina un registro de cliente (cuyo CustomerID es ALFKI) de la tabla Cust y elimina el registro de pedido correspondiente (cuyo OrderID es 1) de la tabla 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>

En el bloque <before>, hay un elemento <Order> (diffgr:id="Order1") y un elemento <Customer> (diffgr:id="Customer1"). Estos elementos representan registros existentes en la base de datos. El elemento <DataInstance> no tiene los registros correspondientes (con el mismo diffgr:id). Esto indica una operación de eliminación.

Para probar el DiffGram:

  1. Cree estas tablas en la base de datos 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. Agregue estos datos de ejemplo:

    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. Copie el DiffGram anterior y péguelo en un archivo de texto. Guarde el archivo como MyDiffGram.xml en la misma carpeta utilizada en el paso anterior.

  4. Copie el DiffGramSchema proporcionado anteriormente en este tema y péguelo en un archivo de texto. Guarde el archivo como DiffGramSchema.xml.

  5. Cree y use el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el DiffGram.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

B. Insertar un registro mediante un DiffGram

En este ejemplo, el DiffGram inserta un registro en la tabla Cust y otro registro en la tabla 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>

En este DiffGram, no se especifica el bloque <before> (no se identifican registros existentes en la base de datos). Hay dos instancias de registro (identificadas por los elementos <Customer> y <Order> en el bloque <DataInstance>) que se asignan a las tablas Cust y Ord, respectivamente. Ambos elementos especifican el atributo diffgr:hasChanges (hasChanges="inserted"). Esto indica una operación de inserción. En este DiffGram, si especifica hasChanges ="modified", indicará que desea modificar un registro que no existe, por lo que producirá un error.

Para probar el DiffGram:

  1. Cree estas tablas en la base de datos 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. Agregue estos datos de ejemplo:

    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. Copie el DiffGram anterior y péguelo en un archivo de texto. Guarde el archivo como MyDiffGram.xml en la misma carpeta utilizada en el paso anterior.

  4. Copie el DiffGramSchema proporcionado anteriormente en este tema y péguelo en un archivo de texto. Guarde el archivo como DiffGramSchema.xml.

  5. Cree y use el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el DiffGram.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

C. Actualizar un registro existente mediante un DiffGram

En este ejemplo, el DiffGram actualiza la información del cliente ALFKI (CompanyName y 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>

El bloque <before> incluye un elemento <Customer> (diffgr:id="Customer1"). El bloque <DataInstance> incluye el elemento <Customer> correspondiente con el mismo id. El elemento <customer> de <NewDataSet> también especifica diffgr:hasChanges="modified". Esto indica una operación de actualización y, por lo tanto, el registro del cliente de la tabla Cust se actualiza en consecuencia. Tenga en cuenta que si no se especifica el atributo diffgr:hasChanges, la lógica de procesamiento de DiffGram omite este elemento y no se realiza ninguna actualización.

Para probar el DiffGram:

  1. Cree estas tablas en la base de datos 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. Agregue estos datos de ejemplo:

    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. Copie el DiffGram anterior y péguelo en un archivo de texto. Guarde el archivo como MyDiffGram.xml en la misma carpeta utilizada en el paso anterior.

  4. Copie el DiffGramSchema proporcionado anteriormente en este tema y péguelo en un archivo de texto. Guarde el archivo como DiffGramSchema.xml.

  5. Cree y use el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el DiffGram.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

D. Insertar, actualizar y eliminar registros mediante un DiffGram

En este ejemplo, se usa un DiffGram relativamente complejo para realizar operaciones de inserción, actualización y eliminación.

<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>

La lógica de DiffGram procesa este DiffGram del modo siguiente:

  • De acuerdo con la lógica de procesamiento de DiffGram, todos los elementos de nivel superior del bloque <before> se asignan a las tablas correspondientes, tal y como se describe en el esquema de asignación.

  • El bloque <before> tiene un elemento <Order> (dffgr:id="Order1") y un elemento <Customer> (diffgr:id="Customer1") para los que no existe ningún elemento correspondiente en el bloque <DataInstance> (con el mismo ID). Esto indica una operación de eliminación y los registros se eliminan de las tablas Cust y Ord.

  • El bloque <before> tiene un elemento <Customer> (diffgr:id="Customer2") para el que existe un elemento <Customer> correspondiente en el bloque <DataInstance> (con el mismo ID). El elemento del bloque <DataInstance> especifica diffgr:hasChanges="modified". Se trata de una operación de actualización en la que la información del cliente ANATR (CompanyName y ContactName) se actualiza en la tabla Cust mediante los valores especificados en el bloque <DataInstance> .

  • El bloque <DataInstance> tiene un elemento <Customer> (diffgr:id="Customer3") y un elemento <Order> (diffgr:id="Order3"). Ninguno de estos elementos especifica el atributo diffgr:hasChanges. Por lo tanto, la lógica de procesamiento de DiffGram omite estos elementos.

  • El bloque <DataInstance> tiene un elemento <Customer> (diffgr:id="Customer4") y un elemento <Order> (diffgr:id="Order4") para los que no existen elementos correspondientes en el bloque <before>. Estos elementos del bloque <DataInstance> especifican diffgr:hasChanges="inserted". Por lo tanto, se agrega un nuevo registro a la tabla Cust y a la tabla Ord.

Para probar el DiffGram:

  1. Cree las siguientes tablas en la base de datos 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. Agregue estos datos de ejemplo:

    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. Copie el DiffGram anterior y péguelo en un archivo de texto. Guarde el archivo como MyDiffGram.xml en la misma carpeta utilizada en el paso anterior.

  4. Copie el DiffGramSchema proporcionado anteriormente en este tema y péguelo en un archivo de texto. Guarde el archivo como DiffGramSchema.xml.

  5. Cree y use el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el DiffGram.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

E. Aplicar actualizaciones mediante un DiffGram con la anotación diffgr:parentID

Este ejemplo muestra la forma de usar la anotación parentID que se especifica en el bloque <before> del DiffGram para aplicar las actualizaciones.

<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>

Este DiffGram especifica una operación de eliminación porque sólo hay un bloque <before>. En el DiffGram, se utiliza la anotación parentID para especificar una relación de elementos primarios y secundarios entre los pedidos y los detalles de los pedidos. Cuando SQLXML elimina los registros, elimina los registros de la tabla secundaria que se identifica mediante esta relación y, a continuación, elimina los registros de la tabla primaria correspondiente.