次の方法で共有


DiffGram の例 (SQLXML 4.0)

ここでは、データベースに対して挿入、変更、および削除の各操作を実行する DiffGram の例を示します。例を使用する前に、次のことに注意してください。

  • 例では、2 つのテーブル (Cust と Ord) を使用します。したがって、DiffGram の例をテストするにはこれらを作成する必要があります。

    Cust(CustomerID, CompanyName, ContactName)
    Ord(OrderID, CustomerID)
    
  • ほとんどの例では、次の XSD スキーマを使用します。

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

    このスキーマを、例で使用する他のファイルと同じフォルダに DiffGramSchema.xml として保存してください。

A. DiffGram を使用してレコードを削除する

この例の DiffGram では、CustomerID が ALFKI の顧客レコードを Cust テーブルから削除し、OrderID が 1 の、対応する注文レコードを 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>

<before> ブロックには、<Order> 要素 (diffgr:id="Order1") と <Customer> 要素 (diffgr:id="Customer1") が指定されています。これらの要素はデータベースの既存のレコードを表します。<DataInstance> 要素には、対応するレコード (同じ diffgr:id のレコード) が指定されておらず、これは削除操作を表します。

DiffGram をテストするには

  1. 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. 次のサンプル データを追加します。

    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. 上の DiffGram をコピーして、テキスト ファイルに貼り付け、前の手順と同じフォルダに MyDiffGram.xml として保存します。

  4. 前で提供されている DiffGramSchema をコピーして、テキスト ファイルに貼り付け、DiffGramSchema.xml として保存します。

  5. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用して DiffGram を実行します。

    詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

B. DiffGram を使用してレコードを挿入する

この例の DiffGram では、Cust テーブルと 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>

この DiffGram では、<before> ブロックが指定されておらず、既存のデータベース レコードが指定されていません。<DataInstance> ブロックには <Customer> 要素と <Order> 要素が指定されており、これらはそれぞれ Cust テーブルと Ord テーブルにマップされる 2 つのレコード インスタンスです。これら両方の要素には、diffgr:hasChanges 属性 (hasChanges="inserted") が指定されており、これは挿入操作を表します。この DiffGram に hasChanges="modified" を指定した場合は、存在しないレコードの変更を表し、この場合はエラーが返されます。

DiffGram をテストするには

  1. 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. 次のサンプル データを追加します。

    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. 上の DiffGram をコピーして、テキスト ファイルに貼り付け、前の手順と同じフォルダに MyDiffGram.xml として保存します。

  4. 前で提供されている DiffGramSchema をコピーして、テキスト ファイルに貼り付け、DiffGramSchema.xml として保存します。

  5. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用して DiffGram を実行します。

    詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

C. DiffGram を使用して既存のレコードを更新する

この例では、DiffGram で顧客 ALFKI の顧客情報 (CompanyName と ContactName) を更新します。

<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> ブロックには同じ id の、対応する <Customer> 要素が含まれています。また、<NewDataSet><customer> 要素には diffgr:hasChanges="modified" が指定されています。これは更新操作であることを示し、Cust テーブルの顧客レコードは指定に従って更新されます。diffgr:hasChanges 属性が指定されていない場合、DiffGram 処理ロジックではこの要素は無視され、更新は行われない点に注意してください。

DiffGram をテストするには

  1. 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. 次のサンプル データを追加します。

    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. 上の DiffGram をコピーして、テキスト ファイルに貼り付け、前の手順と同じフォルダに MyDiffGram.xml として保存します。

  4. 前で提供されている DiffGramSchema をコピーして、テキスト ファイルに貼り付け、DiffGramSchema.xml として保存します。

  5. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用して DiffGram を実行します。

    詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

D. DiffGram を使用して、レコードの挿入、更新、および削除を実行する

この例では、比較的複雑な DiffGram を使用して、挿入、更新、および削除操作を実行します。

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

この DiffGram は、DiffGram のロジックにより次のように処理されます。

  • DiffGram の処理ロジックでは、<before> ブロックのすべての最上位要素が、マッピング スキーマの指定どおり、対応するテーブルにマップされます。
  • <before> ブロックには <Order> 要素 (dffgr:id="Order1") と <Customer> 要素 (diffgr:id="Customer1") がありますが、<DataInstance> ブロックには、これに対応する要素 (同じ ID の要素) はありません。これは削除操作を表し、レコードは Cust テーブルと Ord テーブルから削除されます。
  • <before> ブロックには <Customer> 要素 (diffgr:id="Customer2") があり、<DataInstance> ブロックには、これに対応する (同じ ID の) <Customer> 要素があります。<DataInstance> ブロックの要素には、diffgr:hasChanges="modified" が指定されています。これは更新操作を表し、この場合は顧客 ANATR に対し、<DataInstance> ブロックで指定された値を基に、Cust テーブルの CompanyName と ContactName の情報が更新されます。
  • <DataInstance> ブロックには <Customer> 要素 (diffgr:id="Customer3") と <Order> 要素 (diffgr:id="Order3") がありますが、どちらの要素にも diffgr:hasChanges 属性は指定されていません。このため、DiffGram の処理ロジックで、これらの要素は無視されます。
  • <DataInstance> ブロックには <Customer> 要素 (diffgr:id="Customer4") と <Order> 要素 (diffgr:id="Order4") がありますが、<before> ブロックには、これに対応する要素はありません。<DataInstance> ブロックのこれらの要素には、diffgr:hasChanges="inserted" が指定されています。このため、新しいレコードが Cust テーブルと Ord テーブルに追加されます。

DiffGram をテストするには

  1. 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. 次のサンプル データを追加します。

    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. 上の DiffGram をコピーして、テキスト ファイルに貼り付け、前の手順と同じフォルダに MyDiffGram.xml として保存します。

  4. 前で提供されている DiffGramSchema をコピーして、テキスト ファイルに貼り付け、DiffGramSchema.xml として保存します。

  5. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用して DiffGram を実行します。

    詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

E. DiffGram で diffgr:parentID 注釈を指定して更新を適用する

この例では、DiffGram の <before> ブロックに parentID 注釈を指定して、更新を適用する方法を示します。

<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 では、<before> ブロックだけが指定されており、これは削除操作を表します。この DiffGRam では、parentID 注釈によって、注文と注文の詳細の間の親子リレーションシップが指定されています。SQLXML でレコードが削除されるときには、このリレーションシップで指定された子テーブルからレコードが削除された後、対応する親テーブルからレコードが削除されます。