Ausführen eines DiffGram-Objekts mit verwalteten SQLXML-Klassen
In diesem Beispiel wird gezeigt, wie eine DiffGram-Datei in der Microsoft .NET Framework-Umgebung ausgeführt wird, um Datenupdates mithilfe von verwalteten SQLXML-Klassen (Microsoft.Data.SqlXml) auf SQL Server-Tabellen anzuwenden.
In diesem Beispiel aktualisiert das DiffGram Kundeninformationen (CompanyName und ContactName) für den Kunden 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>
Der <before>-Block enthält ein <Customer>-Element (diffgr:id="Customer1"). Der <DataInstance>-Block enthält das entsprechende <Customer>-Element mit derselben id. Das <customer>-Element in <NewDataSet> gibt zudem diffgr:hasChanges="modified" an. Dadurch wird ein Updatevorgang angezeigt und der Kundendatensatz in der Cust-Tabelle entsprechend aktualisiert. Wenn das diffgr:hasChanges-Attribut nicht angegeben ist, ignoriert die Verarbeitungslogik des DiffGrams jedoch dieses Element, und es werden keine Updates ausgeführt.
Es folgt Code für eine C#-Lernprogrammanwendung, die veranschaulicht, wie verwaltete SQLXML-Klassen zur Ausführung des oben genannten DiffGrams und Aktualisierung zweier Tabellen (Cust, Ord), die Sie ebenfalls in der tempdb-Datenbank erstellen, verwendet werden.
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;
}
}
So testen Sie die Anwendung
Stellen Sie sicher, dass .NET Framework auf dem Computer installiert ist.
Speichern Sie das folgende XSD-Schema (DiffGramSchema.xml) in einem Ordner:
<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>
Erstellen Sie folgende Tabellen in der tempdb-Datenbank.
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
Fügen Sie diese Beispieldaten hinzu:
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')
Kopieren Sie das oben stehende DiffGram, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als MyDiffGram.xml in demselben Ordner, den Sie in Schritt 1 verwendet haben.
Speichern Sie den C#-Code (DiffgramSample.cs) aus dem Beispiel oben im selben Ordner, in dem DiffGramSchema.xml und MyDiffGram.xml aus den vorherigen Schritten gespeichert wurden.
Hinweis Sie müssen den Namen der SQL Server-Instanz in der Verbindungszeichenfolge von 'MyServer' in den tatsächlichen Namen Ihrer installierten Instanz von SQL Server ändern.
Wenn Sie die Dateien in einem anderen Ordner speichern, müssen Sie den Code bearbeiten und den entsprechenden Verzeichnispfad für das Zuordnungsschema angeben.
Kompilieren Sie den Code. Verwenden Sie zur Kompilierung des Codes an der Eingabeaufforderung die folgende Zeichenfolge:
csc /reference:Microsoft.Data.SqlXML.dll DiffgramSample.cs
Dadurch wird eine ausführbare Datei (DiffgramSample.exe) erstellt.
Führen Sie DiffgramSample.exe an der Eingabeaufforderung aus.