Выполнение дельты с использованием управляемых классов SQLXML
Этот пример показывает, как выполнять файл DiffGram в среде Microsoft .NET Framework для применения обновлений данных к таблицам SQL Server с использованием управляемых классов SQLXML (Microsoft.Data.SqlXml).
В этом примере дельта обновляет 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, то логика обработки дельты пропустит этот элемент, и обновление не будет выполнено.
Приведенный ниже код для учебного приложения на языке C# показывает, как использовать управляемые классы SQLXML для выполнения вышеупомянутого файла DiffGram и для обновления двух таблиц (Cust, Ord), которые будут также созданы в базе данных tempdb.
using System;
using System.Data;
using Microsoft.Data.SqlXml;
using System.IO;
class Test
{
static string ConnString = "Provider=SQLOLEDB;Server=MyServer;database=tempdb;Integrated Security=SSPI;";
public static int testParams()
{
SqlXmlAdapter ad;
// Need a memory stream to hold diff gram temporarily
MemoryStream ms = new MemoryStream();
SqlXmlCommand cmd = new SqlXmlCommand(ConnString);
cmd.RootTag = "ROOT";
cmd.CommandStream = new FileStream("MyDiffgram.xml", FileMode.Open, FileAccess.Read);
cmd.CommandType = SqlXmlCommandType.DiffGram;
cmd.SchemaPath = "DiffGramSchema.xml";
// Load data set
DataSet ds = new DataSet();
ad = new SqlXmlAdapter(cmd);
ad.Fill(ds);
ad.Update(ds);
return 0;
}
public static int Main(String[] args)
{
testParams();
return 0;
}
}
Тестирование приложения
Проследите за тем, чтобы на вашем компьютере была установлена .NET Framework.
Сохраните в папке следующую схему XSD (DiffGramSchema.xml):
<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>
Создайте следующие таблицы в базе данных 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
Добавьте следующий образец данных:
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 в папке, которая использовалась на шаге 1.
Сохраните помещенный выше код на языке C# (DiffgramSample.cs) в той же папке, в которой при выполнении предшествующих шагов были сохранены файлы DiffGramSchema.xml и MyDiffGram.xml.
Примечание
При этом потребуется обновить имя экземпляра SQL Server в строке соединения, то есть заменить имя 'MyServer' на фактическое имя установленного экземпляра SQL Server.
Если сохранить файлы в разных папках, то придется изменить код, указав путь к каталогу, в котором находится схема сопоставления.
Скомпилируйте код. Чтобы скомпилировать код из командной строки, введите следующую команду.
csc /reference:Microsoft.Data.SqlXML.dll DiffgramSample.cs
В результате создается исполняемый файл (DiffgramSample.exe).
Из командной строки выполните файл DiffgramSample.exe.