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.
Se aplica a:SQL Server
Azure SQL Database
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 >, hay un> (diffgr:id="Order1") y un > (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 utilizada 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 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 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 anterior> (no se identifican registros de base de datos existentes). Hay dos instancias de registro (identificadas por los > y<> 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 utilizada 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 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. 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 > incluye un > (diffgr:id="Customer1"). El > incluye el elemento Customer<>con el mismo identificador. El <> de > 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 utilizada 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 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. 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 anterior> se asignan a las tablas correspondientes, como se describe en el esquema de asignación.
El > tiene un <> (dffgr:id="Order1") y un > (diffgr:id="Customer1") para el que no hay ningún elemento correspondiente en el> (con el mismo identificador). Esto indica una operación de eliminación y los registros se eliminan de las tablas Cust y Ord.
El > tiene un <> (diffgr:id="Customer2") para el que hay un elemento Customer<>en el > (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 >.
El > tiene un <> (diffgr:id="Customer3") y un <> (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 > tiene un <> (diffgr:id="Customer4") y un > (diffgr:id="Order4") para el que no hay elementos correspondientes en el bloque anterior<.> Estos elementos del > 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:
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 utilizada 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 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. Aplicar 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 > 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 >. 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 que se identifica mediante esta relación y, a continuación, elimina los registros de la tabla primaria correspondiente.