Bagikan melalui


Contoh DiffGram (SQLXML 4.0)

Contoh dalam topik ini terdiri dari DiffGrams yang melakukan operasi sisipkan, perbarui, dan hapus ke database. Sebelum menggunakan contoh, perhatikan hal berikut:

  • Contoh menggunakan dua tabel (Cust dan Ord) yang harus dibuat jika Anda ingin menguji contoh DiffGram:

    Cust(CustomerID, CompanyName, ContactName)  
    Ord(OrderID, CustomerID)  
    
  • Sebagian besar contoh dalam topik ini menggunakan Skema XSD berikut:

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

    Simpan skema ini sebagai DiffGramSchema.xml di folder yang sama tempat Anda menyimpan file lain yang digunakan dalam contoh.

Sebuah. Menghapus rekaman dengan menggunakan DiffGram

DiffGram dalam contoh ini menghapus rekaman pelanggan (yang CustomerID-nya adalah ALFKI) dari tabel Cust dan menghapus catatan pesanan yang sesuai (yang OrderID-nya adalah 1) dari tabel 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>  

<Di blok sebelumnya>, ada <elemen Order> (diffgr:id="Order1") dan <elemen Customer> (diffgr:id="Customer1"). Elemen-elemen ini mewakili rekaman yang ada dalam database. Elemen <DataInstance> tidak memiliki rekaman yang sesuai (dengan diffgr:id yang sama). Ini menunjukkan operasi penghapusan.

Untuk menguji DiffGram

  1. Buat tabel ini di database 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  
    
  2. Tambahkan data sampel ini:

    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. Salin DiffGram di atas dan tempelkan ke dalam file teks. Simpan file sebagai MyDiffGram.xml di folder yang sama yang digunakan di langkah sebelumnya.

  4. Salin DiffGramSchema yang disediakan sebelumnya dalam topik ini dan tempelkan ke dalam file teks. Simpan file sebagai DiffGramSchema.xml.

  5. Buat dan gunakan Skrip Pengujian SQLXML 4.0 (Sqlxml4test.vbs) untuk menjalankan DiffGram.

    Untuk informasi selengkapnya, lihat Menggunakan ADO untuk Menjalankan Kueri SQLXML 4.0.

B. Menyisipkan rekaman dengan menggunakan DiffGram

Dalam contoh ini, DiffGram menyisipkan rekaman dalam tabel Cust dan rekaman dalam tabel 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>  

Dalam DiffGram <ini blok sebelum> tidak ditentukan (tidak ada rekaman database yang diidentifikasi). Ada dua instans rekaman (diidentifikasi oleh <elemen Pelanggan> dan <Pesanan> di <blok DataInstance> ) yang masing-masing memetakan ke tabel Cust dan Ord. Kedua elemen ini menentukan atribut diffgr:hasChanges (hasChanges="inserted"). Ini menunjukkan operasi penyisipan. Dalam DiffGram ini, jika Anda menentukan hasChanges="modified", Anda menunjukkan bahwa Anda ingin mengubah rekaman yang tidak ada, yang mengakibatkan kesalahan.

Untuk menguji DiffGram

  1. Buat tabel ini di database 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  
    
  2. Tambahkan data sampel ini:

    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. Salin DiffGram di atas dan tempelkan ke dalam file teks. Simpan file sebagai MyDiffGram.xml di folder yang sama yang digunakan di langkah sebelumnya.

  4. Salin DiffGramSchema yang disediakan sebelumnya dalam topik ini dan tempelkan ke dalam file teks. Simpan file sebagai DiffGramSchema.xml.

  5. Buat dan gunakan Skrip Pengujian SQLXML 4.0 (Sqlxml4test.vbs) untuk menjalankan DiffGram.

    Untuk informasi selengkapnya, lihat Menggunakan ADO untuk Menjalankan Kueri SQLXML 4.0.

C. Memperbarui rekaman yang sudah ada dengan menggunakan DiffGram

Dalam contoh ini, DiffGram memperbarui informasi pelanggan (CompanyName dan ContactName) untuk ALFKI pelanggan.

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

Blok <sebelumnya> menyertakan <elemen Pelanggan> (diffgr:id="Customer1"). Blok <DataInstance> menyertakan elemen Pelanggan< yang> sesuai dengan id yang sama. Elemen <pelanggan> di <NewDataSet> juga menentukan diffgr:hasChanges="modified". Ini menunjukkan operasi pembaruan, dan catatan pelanggan dalam tabel Cust diperbarui. Perhatikan bahwa jika atribut diffgr:hasChanges tidak ditentukan, logika pemrosesan DiffGram mengabaikan elemen ini dan tidak ada pembaruan yang dilakukan.

Untuk menguji DiffGram

  1. Buat tabel ini di database 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  
    
  2. Tambahkan data sampel ini:

    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. Salin DiffGram di atas dan tempelkan ke dalam file teks. Simpan file sebagai MyDiffGram.xml di folder yang sama yang digunakan di langkah sebelumnya.

  4. Salin DiffGramSchema yang disediakan sebelumnya dalam topik ini dan tempelkan ke dalam file teks. Simpan file sebagai DiffGramSchema.xml.

  5. Buat dan gunakan Skrip Pengujian SQLXML 4.0 (Sqlxml4test.vbs) untuk menjalankan DiffGram.

    Untuk informasi selengkapnya, lihat Menggunakan ADO untuk Menjalankan Kueri SQLXML 4.0.

D. Menyisipkan, memperbarui, dan menghapus rekaman dengan menggunakan DiffGram

Dalam contoh ini, DiffGram yang relatif kompleks digunakan untuk melakukan operasi sisipkan, perbarui, dan hapus.

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

Logika DiffGram memproses DiffGram ini sebagai berikut:

  • Sesuai dengan logika pemrosesan DiffGram, semua elemen tingkat atas di <sebelum> memblokir peta ke tabel yang sesuai, seperti yang dijelaskan dalam skema pemetaan.

  • Blok <sebelum> memiliki <elemen Pesanan> (dffgr:id="Order1") dan <elemen Pelanggan> (diffgr:id="Customer1") yang tidak ada elemen yang sesuai di <blok DataInstance> (dengan ID yang sama). Ini menunjukkan operasi penghapusan, dan rekaman dihapus dari tabel Cust dan Ord.

  • Blok <sebelumnya> memiliki <elemen Pelanggan> (diffgr:id="Customer2") yang ada elemen Pelanggan> yang sesuai< di <blok DataInstance> (dengan ID yang sama). Elemen dalam <blok DataInstance> menentukan diffgr:hasChanges="modified". Ini adalah operasi pembaruan di mana untuk ANATR pelanggan, informasi CompanyName dan ContactName diperbarui dalam tabel Cust menggunakan nilai yang ditentukan di <blok DataInstance> .

  • Blok <DataInstance> memiliki <elemen Pelanggan> (diffgr:id="Customer3") dan <elemen Order> (diffgr:id="Order3"). Tidak satu pun dari elemen-elemen ini menentukan atribut diffgr:hasChanges . Oleh karena itu, logika pemrosesan DiffGram mengabaikan elemen-elemen ini.

  • Blok <DataInstance> memiliki <elemen Pelanggan> (diffgr:id="Customer4") dan <elemen Order> (diffgr:id="Order4") yang tidak ada elemen yang sesuai di <blok sebelumnya> . Elemen-elemen ini <di blok DataInstance> menentukan diffgr:hasChanges="inserted". Oleh karena itu, rekaman baru ditambahkan dalam tabel Cust dan dalam tabel Ord.

Untuk menguji DiffGram

  1. Buat tabel berikut di database 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  
    
  2. Tambahkan data sampel ini:

    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. Salin DiffGram di atas dan tempelkan ke dalam file teks. Simpan file sebagai MyDiffGram.xml di folder yang sama yang digunakan di langkah sebelumnya.

  4. Salin DiffGramSchema yang disediakan sebelumnya dalam topik ini dan tempelkan ke dalam file teks. Simpan file sebagai DiffGramSchema.xml.

  5. Buat dan gunakan Skrip Pengujian SQLXML 4.0 (Sqlxml4test.vbs) untuk menjalankan DiffGram.

    Untuk informasi selengkapnya, lihat Menggunakan ADO untuk Menjalankan Kueri SQLXML 4.0.

E. Menerapkan pembaruan dengan menggunakan DiffGram dengan anotasi diffgr:parentID

Contoh ini menggambarkan bagaimana anotasi parentID yang ditentukan di <blok sebelum> DiffGram digunakan dalam menerapkan pembaruan.

<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 ini menentukan operasi penghapusan karena hanya <ada blok sebelum> . Di DiffGram, anotasi parentID digunakan untuk menentukan hubungan induk-turunan antara pesanan dan detail pesanan. Saat SQLXML menghapus rekaman, SQLXML menghapus rekaman dari tabel anak yang diidentifikasi oleh hubungan ini lalu menghapus rekaman dari tabel induk yang sesuai.