DiffGram-Beispiele (SQLXML 4.0)

Die Beispiele in diesem Thema umfassen DiffGrams, mit denen Einfüge-, Aktualisierungs- und Löschvorgänge in der Datenbank vorgenommen werden. Bevor Sie die Beispiele verwenden, beachten Sie Folgendes:

  • In den Beispielen werden zwei Tabellen verwendet (Cust und Ord), die erstellt werden müssen, wenn Sie die DiffGram-Beispiele testen möchten:

    Cust(CustomerID, CompanyName, ContactName)
    Ord(OrderID, CustomerID)
    
  • Die meisten der Beispiele in diesem Thema verwenden das folgende XSD-Schema:

    <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>   
    

    Speichern Sie dieses Schema als DiffGramSchema.xml im gleichen Ordner, in dem Sie auch die anderen in diesem Beispiel verwendeten Dateien gespeichert haben.

A. Löschen eines Datensatzes mithilfe eines DiffGrams

Mit dem DiffGram in diesem Beispiel werden ein Kundendatensatz (mit der CustomerID ALFKI) aus der Cust-Tabelle und der entsprechende Auftragsdatensatz (mit der OrderID 1) aus der Ord-Tabelle gelöscht.

<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>

Der <before>-Block umfasst ein <Order>-Element (diffgr:id="Order1") und ein <Customer>-Element (diffgr:id="Customer1"). Diese Elemente stellen vorhandene Datensätze in der Datenbank dar. Das <DataInstance>-Element verfügt nicht über die entsprechenden Datensätze (mit der gleichen diffgr:id). Dies gibt einen Löschvorgang an.

So testen Sie das DiffGram-Objekt

  1. Erstellen Sie die folgenden 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
    
  2. 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')
    
  3. 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 im vorherigen Schritt verwendet haben.

  4. Kopieren Sie das zuvor in diesem Thema bereitgestellte DiffGramSchema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen DiffGramSchema.xml.

  5. Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um das DiffGram auszuführen.

    Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.

A. Einfügen eines Datensatzes mithilfe eines DiffGrams

In diesem Beispiel fügt das DiffGram einen Datensatz in die Tabellen Cust und Ord ein.

<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>

In diesem DiffGram wird der <before>-Block nicht angegeben. (Es wurden keine vorhandenen Datenbank-Datensätze erkannt.) Es gibt zwei Datensatzinstanzen (markiert durch die <Customer>- und <Order>-Elemente im <DataInstance>-Block), die jeweils den Cust- und Ord-Tabellen zugeordnet werden. Beide dieser Elemente geben das diffgr:hasChanges-Attribut (hasChanges="inserted") an. Dies gibt einen Einfügevorgang an. Wenn Sie in diesem DiffGram hasChanges="modified" festlegen, geben Sie an, dass Sie einen nicht vorhandenen Datensatz ändern möchten. Dies führt zu einem Fehler.

So testen Sie das DiffGram-Objekt

  1. 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
    
  2. 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')
    
  3. 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 im vorherigen Schritt verwendet haben.

  4. Kopieren Sie das zuvor in diesem Thema bereitgestellte DiffGramSchema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen DiffGramSchema.xml.

  5. Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um das DiffGram auszuführen.

    Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.

C. Aktualisieren eines vorhandenen Datensatzes mit einem DiffGram

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 Aktualisierungsvorgang angezeigt. Der Kundendatensatz in der Cust-Tabelle wird entsprechend aktualisiert. Wenn das diffgr:hasChanges-Attribut nicht angegeben ist, ignoriert die Verarbeitungslogik des DiffGrams jedoch dieses Element, und es werden keine Aktualisierungen ausgeführt.

So testen Sie das DiffGram-Objekt

  1. Erstellen Sie die folgenden 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
    
  2. 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')
    
  3. 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 im vorherigen Schritt verwendet haben.

  4. Kopieren Sie das zuvor in diesem Thema bereitgestellte DiffGramSchema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen DiffGramSchema.xml.

  5. Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um das DiffGram auszuführen.

    Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.

D. Einfügen, Aktualisieren und Löschen von Datensätzen mit einem DiffGram

In diesem Beispiel wird ein relativ komplexes DiffGram verwendet, um Einfüge-, Aktualisierungs- und Löschvorgänge durchzuführen.

<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>

Die DiffGram-Logik verarbeitet dieses DiffGram folgendermaßen:

  • In Übereinstimmung mit der DiffGram-Verarbeitungslogik werden alle Elemente der obersten Stufe im <before>-Block den entsprechenden Tabellen zugeordnet, wie im Zuordnungsschema festgelegt.

  • Der <before>-Block umfasst ein <Order>-Element (dffgr:id="Order1") und ein <Customer>-Element (diffgr:id="Customer1"), für das es kein entsprechendes Element im <DataInstance>-Block (mit der gleichen ID) gibt. Dies gibt einen Löschvorgang an, und die Datensätze werden aus den Cust- und Ord-Tabellen gelöscht.

  • Der <before>-Block umfasst ein <Customer>-Element (diffgr:id="Customer2"), für das es ein entsprechendes <Customer>-Element im <DataInstance>-Block (mit der gleichen ID) gibt. Das Element im <DataInstance>-Block gibt diffgr:hasChanges="modified" an. Dabei handelt es sich um einen Aktualisierungsvorgang, bei dem für den Kunden ANATR, die Angaben CompanyName und ContactName in der Cust-Tabelle mit Werten, die im <DataInstance>-Block angegeben werden, aktualisiert werden.

  • Der <DataInstance>-Block umfasst ein <Customer>-Element (diffgr:id="Customer3") und ein <Order>-Element (diffgr:id="Order3"). Keines dieser Elemente gibt das diffgr:hasChanges-Attribut an. Daher ignoriert die DiffGram-Verarbeitungslogik diese Elemente.

  • Der <DataInstance>-Block umfasst ein <Customer>-Element (diffgr:id="Customer4") und ein <Order>-Element (diffgr:id="Order4"), für das es keine entsprechenden Elemente im <before>-Block gibt. Diese Elemente im <DataInstance>-Block geben diffgr:hasChanges="inserted" an. Daher wird ein neuer Datensatz der Cust-Tabelle und der Ord-Tabelle hinzugefügt.

So testen Sie das DiffGram-Objekt

  1. Erstellen Sie die folgenden 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
    
  2. 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')
    
  3. 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 im vorherigen Schritt verwendet haben.

  4. Kopieren Sie das zuvor in diesem Thema bereitgestellte DiffGramSchema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen DiffGramSchema.xml.

  5. Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um das DiffGram auszuführen.

    Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.

E. Übernehmen von Aktualisierungen mit einem DiffGram mit der diffgr:parentID-Anmerkung

Dieses Beispiel veranschaulicht, wie die parentID-Anmerkung, die im <before>-Block des DiffGrams angegeben wurde, zum Übernehmen der Aktualisierungen verwendet wird.

<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>

Dieses DiffGram gibt einen Löschvorgang an, da es nur einen <before>-Block gibt. Im DiffGram wird die parentID-Anmerkung zur Angabe einer Parent-Child-Beziehung zwischen den Bestellungen und anderen Angaben verwendet. Wenn SQLXML die Datensätze löscht, werden auch die Datensätze aus der untergeordneten Tabelle, die durch diese Beziehung gekennzeichnet wird, gelöscht. Anschließend werden die Datensätze aus der entsprechenden übergeordneten Tabelle gelöscht.