Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los ejemplos de este tema constan de diffGrams 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 se deben 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 guardará otros archivos usados en los ejemplos.
Un. Eliminación de un registro mediante un diffGram
El DiffGram de este ejemplo elimina un registro customer (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 anterior> , 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
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)) GOAgregue 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')Copie el DiffGram anterior y péguelo en un archivo de texto. Guarde el archivo como MyDiffGram.xml en la misma carpeta usada en el paso anterior.
Copie el diffGramSchema proporcionado anteriormente en este tema y péguelo en un archivo de texto. Guarde el archivo como DiffGramSchema.xml.
Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el diffGram.
Para obtener más información, consulte Uso de 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 un registro 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>
<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 anterior> (no se identifican registros de base de datos existentes). 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", indica que quiere modificar un registro que no existe, lo que produce un error.
Para probar el diffGram
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)) GOAgregue 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')Copie el DiffGram anterior y péguelo en un archivo de texto. Guarde el archivo como MyDiffGram.xml en la misma carpeta usada en el paso anterior.
Copie el diffGramSchema proporcionado anteriormente en este tema y péguelo en un archivo de texto. Guarde el archivo como DiffGramSchema.xml.
Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el diffGram.
Para obtener más información, consulte Uso de ADO para ejecutar consultas SQLXML 4.0.
C. Actualización de un registro existente mediante un diffGram
En este ejemplo, DiffGram actualiza la información del cliente (CompanyName y ContactName) para el cliente 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>
El <bloque anterior> incluye un <elemento Customer> (diffgr:id="Customer1"). El <bloque DataInstance> incluye el elemento Customer> correspondiente< con el mismo identificador. El <elemento customer> de <NewDataSet> también especifica diffgr:hasChanges="modified". Esto indica una operación de actualización y el registro del cliente en la tabla Cust se actualiza en consecuencia. Tenga en cuenta que si no se especifica el atributo diffgr:hasChanges , la lógica de procesamiento diffGram omite este elemento y no se realiza ninguna actualización.
Para probar el diffGram
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)) GOAgregue 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')Copie el DiffGram anterior y péguelo en un archivo de texto. Guarde el archivo como MyDiffGram.xml en la misma carpeta usada en el paso anterior.
Copie el diffGramSchema proporcionado anteriormente en este tema y péguelo en un archivo de texto. Guarde el archivo como DiffGramSchema.xml.
Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el diffGram.
Para obtener más información, consulte Uso de ADO para ejecutar consultas SQLXML 4.0.
D. Inserción, actualización y eliminación de 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 diffGram procesa este diffGram de la siguiente manera:
De acuerdo con la lógica de procesamiento de DiffGram, todos los elementos de nivel superior del <bloque anterior> se asignan a las tablas correspondientes, 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 el que no hay ningún elemento correspondiente en el <bloque DataInstance> (con el mismo identificador). Esto indica una operación de eliminación y los registros se eliminan de las tablas Cust y Ord.
El <bloque anterior> tiene un <elemento Customer> (diffgr:id="Customer2") para el que hay un elemento Customer> correspondiente< en el <bloque DataInstance> (con el mismo identificador). El elemento del <bloque DataInstance> especifica diffgr:hasChanges="modified". Se trata de una operación de actualización en la que, para anaTR del cliente, la información CompanyName y ContactName se actualiza en la tabla Cust mediante 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 el que no hay elementos correspondientes en el <bloque anterior> . Estos elementos del <bloque DataInstance> especifican diffgr:hasChanges="inserted". Por lo tanto, se agrega un nuevo registro en la tabla Cust y en la tabla Ord.
Para probar el diffGram
Cree las tablas siguientes 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)) GOAgregue 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')Copie el DiffGram anterior y péguelo en un archivo de texto. Guarde el archivo como MyDiffGram.xml en la misma carpeta usada en el paso anterior.
Copie el diffGramSchema proporcionado anteriormente en este tema y péguelo en un archivo de texto. Guarde el archivo como DiffGramSchema.xml.
Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el diffGram.
Para obtener más información, consulte Uso de ADO para ejecutar consultas SQLXML 4.0.
E. Aplicación de actualizaciones mediante un diffGram con la anotación diffgr:parentID
En este ejemplo se muestra cómo se usa la anotación parentID especificada en el <bloque anterior> 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 solo hay un <bloque anterior> . En diffGram, la anotación parentID se usa para especificar una relación de elementos primarios y secundarios entre los pedidos y los detalles del pedido. Cuando SQLXML elimina los registros, elimina los registros de la tabla secundaria identificada por esta relación y, a continuación, elimina los registros de la tabla primaria correspondiente.