Примеры дельты (SQLXML 4.0)
Примеры в данном разделе состоят из нескольких DiffGram, которые выполняют операции вставки, обновления и удаления в базе данных. При использовании примеров необходимо учитывать следующие моменты.
Примеры используют две таблицы (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 и удаляет соответствующую запись заказа (с атрибутом OrderID со значением 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>
В блоке <before> находятся элементы <Order> (diffgr:id="Order1") и <Customer> (diffgr:id="Customer1"). Данные элементы представляют существующие записи в базе данных. Элемент <DataInstance> не имеет соответствующих записей (с тем же diffgr:id). Это указывает на операцию удаления.
Проверка дельты
Создайте следующие таблицы в базе данных tempdb.
CREATE TABLE Cust( CustomerID nchar(5) Primary Key, CompanyName nvarchar(40) NOT NULL , ContactName nvarchar(60) NULL)GOCREATE TABLE Ord( OrderID int Primary Key, CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID))GO
Добавьте следующий образец данных:
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 Taqueria', 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')
Скопируйте приведенную выше дельту и вставьте ее в текстовый файл. Сохраните файл с именем MyDiffGram.xml в папке, которая использовалась на предыдущем шаге.
Скопируйте схему DiffGramSchema, приведенную ранее в этом разделе, и вставьте ее в текстовый файл. Сохраните файл с именем DiffGramSchema.xml.
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить дельту.
Дополнительные сведения см. в разделе Использование 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 блок <before> не указывается (не определены существующие записи базы данных). Существует два экземпляра записи (определенные элементами <Customer> и <Order> в блоке <DataInstance>), которые соответствуют таблицам Cust и Ord соответственно. Оба эти элемента указывают атрибут diffgr:hasChanges (hasChanges="inserted"). Это указывает на операцию вставки. В данном объекте DiffGram задание hasChanges="modified" указывает на попытку изменения несуществующей записи, что приводит к ошибке.
Проверка дельты
Создайте следующие таблицы в базе данных tempdb.
CREATE TABLE Cust( CustomerID nchar(5) Primary Key, CompanyName nvarchar(40) NOT NULL , ContactName nvarchar(60) NULL)GOCREATE TABLE Ord( OrderID int Primary Key, CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID))GO
Добавьте следующий образец данных:
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 Taqueria', 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')
Скопируйте приведенную выше дельту и вставьте ее в текстовый файл. Сохраните файл с именем MyDiffGram.xml в папке, которая использовалась на предыдущем шаге.
Скопируйте схему DiffGramSchema, приведенную ранее в этом разделе, и вставьте ее в текстовый файл. Сохраните файл с именем DiffGramSchema.xml.
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить дельту.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
В. Обновление существующей записи с помощью 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>
Блок <before> содержит элемент <Customer> (diffgr:id="Customer1"). Блок <DataInstance> содержит соответствующий элемент <Customer> с тем же значением атрибута id. Элемент <customer> в наборе <NewDataSet> также задает атрибут diffgr:hasChanges="modified". Это указывает на операцию вставки, и пользовательская запись в таблице Cust обновляется соответствующим образом. Заметьте, что если не задан атрибут diffgr:hasChanges, то логика обработки дельты пропустит этот элемент, и обновление не будет выполнено.
Проверка дельты
Создайте следующие таблицы в базе данных tempdb.
CREATE TABLE Cust( CustomerID nchar(5) Primary Key, CompanyName nvarchar(40) NOT NULL , ContactName nvarchar(60) NULL)GOCREATE TABLE Ord( OrderID int Primary Key, CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID))GO
Добавьте следующий образец данных:
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 Taqueria', 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')
Скопируйте приведенную выше дельту и вставьте ее в текстовый файл. Сохраните файл с именем MyDiffGram.xml в папке, которая использовалась на предыдущем шаге.
Скопируйте схему DiffGramSchema, приведенную ранее в этом разделе, и вставьте ее в текстовый файл. Сохраните файл с именем DiffGramSchema.xml.
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить дельту.
Дополнительные сведения см. в разделе Использование 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 все элементы верхнего уровня блока <> соответствуют определенным таблицам, как описано в схеме сопоставления.
Блок <before> содержит элементы <Order> (dffgr:id="Order1") и <Customer> (diffgr:id="Customer1"), для которых существует соответствующий элемент в блоке <DataInstance> (с одинаковым идентификатором). Это указывает на операцию удаления, и записи удаляются из таблиц Cust и Ord.
Блок <before> содержит элемент <Customer> (diffgr:id="Customer2"), для которого существует соответствующий элемент <Customer> в блоке <DataInstance> (с одинаковым идентификатором). Элемент в блоке <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"), для которых существует соответствующий элемент в блоке <before>. Эти элементы в блоке <DataInstance> указывают атрибут diffgr:hasChanges="inserted". Таким образом, в таблицы Cust и Ord добавляется новая запись.
Проверка дельты
Создайте следующие таблицы в базе данных tempdb.
CREATE TABLE Cust( CustomerID nchar(5) Primary Key, CompanyName nvarchar(40) NOT NULL , ContactName nvarchar(60) NULL)GOCREATE TABLE Ord( OrderID int Primary Key, CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID))GO
Добавьте следующий образец данных:
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 Taqueria', 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')
Скопируйте приведенную выше дельту и вставьте ее в текстовый файл. Сохраните файл с именем MyDiffGram.xml в папке, которая использовалась на предыдущем шаге.
Скопируйте схему DiffGramSchema, приведенную ранее в этом разделе, и вставьте ее в текстовый файл. Сохраните файл с именем DiffGramSchema.xml.
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить дельту.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
Д. Применение обновлений с помощью DiffGram с заметкой diffgr:parentID
Данный пример иллюстрирует, как заметка parentID, указанная в блоке <before> объекта 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 указывает на операцию удаления, так как имеется только блок <before> . В DiffGram заметка parentID используется для указания связи типа «родители-потомки» между заказами и сведениями о заказах. При удалении записей посредством SQLXML они удаляются из дочерней таблицы, указанной этой связью, а после этого из соответствующей родительской таблицы.