Freigeben über


DiffGram-Beispiele (SQLXML 4.0)

Die Beispiele in diesem Thema bestehen aus DiffGrams, die Einfüge-, Aktualisierungs- und Löschvorgänge an die Datenbank ausführen. Bevor Sie die Beispiele verwenden, beachten Sie Folgendes:

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

    Cust(CustomerID, CompanyName, ContactName)  
    Ord(OrderID, CustomerID)  
    
  • Die meisten 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 selben Ordner, in dem Sie andere dateien speichern, die in den Beispielen verwendet werden.

Ein. Löschen eines Datensatzes mithilfe eines DiffGrams

Das DiffGram in diesem Beispiel löscht einen Kundendatensatz (dessen CustomerID ALFKI ist) aus der Cust-Tabelle und löscht den entsprechenden Auftragsdatensatz (dessen OrderID 1 ist) aus der Ord-Tabelle.

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

<Im vorherigen> Block gibt es 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 demselben diffgr:id). Dies gibt einen Löschvorgang an.

So testen Sie das DiffGram

  1. Erstellen Sie diese 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 DiffGram oben, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als MyDiffGram.xml im gleichen Ordner, der im vorherigen Schritt verwendet wird.

  4. Kopieren Sie das weiter oben in diesem Thema bereitgestellte DiffGramSchema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als 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.

B. Einfügen eines Datensatzes mithilfe eines DiffGrams

In diesem Beispiel fügt das DiffGram einen Datensatz in die Cust-Tabelle und einen Datensatz in der Ord-Tabelle 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 (keine vorhandenen Datenbankdatensätze identifiziert). Es gibt zwei Datensatzinstanzen (die durch die <Elemente "Customer> " und <"Order> " im <DataInstance-Block> identifiziert werden), die den Tabellen "Cust" bzw. "Ord" zugeordnet sind. Beide Elemente geben das diffgr:hasChanges-Attribut an (hasChanges="inserted"). Dies gibt einen Einfügevorgang an. Wenn Sie in diesem DiffGram "hasChanges="modified" angeben, geben Sie an, dass Sie einen datensatz ändern möchten, der nicht vorhanden ist, was zu einem Fehler führt.

So testen Sie das DiffGram

  1. Erstellen Sie diese 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 DiffGram oben, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als MyDiffGram.xml im gleichen Ordner, der im vorherigen Schritt verwendet wird.

  4. Kopieren Sie das weiter oben in diesem Thema bereitgestellte DiffGramSchema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als 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 mithilfe eines DiffGram

In diesem Beispiel aktualisiert das DiffGram Kundeninformationen (CompanyName und ContactName) für 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> im <NewDataSet> gibt auch diffgr:hasChanges="modified" an. Dies gibt einen Aktualisierungsvorgang an, und der Kundendatensatz in der Cust-Tabelle wird entsprechend aktualisiert. Beachten Sie, dass, wenn das diffgr:hasChanges-Attribut nicht angegeben ist, die DiffGram-Verarbeitungslogik dieses Element ignoriert und keine Aktualisierungen ausgeführt werden.

So testen Sie das DiffGram

  1. Erstellen Sie diese 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 DiffGram oben, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als MyDiffGram.xml im gleichen Ordner, der im vorherigen Schritt verwendet wird.

  4. Kopieren Sie das weiter oben in diesem Thema bereitgestellte DiffGramSchema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als 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 mithilfe eines DiffGram

In diesem Beispiel wird ein relativ komplexes DiffGram zum Ausführen von Einfüge-, Aktualisierungs- und Löschvorgängen verwendet.

<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 wie folgt:

  • Entsprechend der DiffGram-Verarbeitungslogik werden alle Elemente der obersten Ebene in der <vorherigen> Blockzuordnung den entsprechenden Tabellen zugeordnet, wie im Zuordnungsschema beschrieben.

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

  • Der <before-Block> weist ein <Customer-Element> (diffgr:id="Customer2") auf, für das ein entsprechendes <Customer-Element> im <DataInstance-Block> (mit derselben ID) vorhanden ist. Das Element im <DataInstance-Block> gibt diffgr:hasChanges="modified" an. Dies ist ein Aktualisierungsvorgang, bei dem für Kunden ANATR die Informationen "CompanyName" und "ContactName" in der Cust-Tabelle mithilfe von Werten aktualisiert werden, die <im DataInstance-Block> angegeben sind.

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

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

So testen Sie das DiffGram

  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 DiffGram oben, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als MyDiffGram.xml im gleichen Ordner, der im vorherigen Schritt verwendet wird.

  4. Kopieren Sie das weiter oben in diesem Thema bereitgestellte DiffGramSchema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als 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. Anwenden von Updates mithilfe eines DiffGrams mit der diffgr:parentID-Anmerkung

In diesem Beispiel wird veranschaulicht, wie die parentID-Anmerkung , die <im Vorblock> des DiffGram angegeben ist, beim Anwenden der Updates 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 nur ein <Vorblock> vorhanden ist. Im DiffGram wird die parentID-Anmerkung verwendet, um eine Beziehung zwischen den Bestellungen und Bestelldetails als übergeordnetes Untergeordnetes Element anzugeben. Wenn SQLXML die Datensätze löscht, löscht es Datensätze aus der untergeordneten Tabelle, die durch diese Beziehung identifiziert wird, und löscht dann die Datensätze aus der entsprechenden übergeordneten Tabelle.