次の方法で共有


差分グラム

DiffGram は、データ要素の現在のバージョンと元のバージョンを識別する XML 形式です。 DataSet では、 の内容を読み込んで永続化するため、およびネットワーク接続経由で転送する場合にこの内容をシリアル化するために、DiffGram 形式が使用されます。 DataSetが DiffGram として書き込まれると、DataSetOriginal行バージョンの両方の列値、行エラー情報、行の順序など、Currentのスキーマではなく、内容を正確に再作成するために必要なすべての情報が DiffGram に設定されます。

XML Web サービスから DataSet を送信または取得するときには、DiffGram 形式が暗黙的に使用されます。 また、DataSet メソッドを使用して XML からReadXmlの内容を読み込む場合や、DataSet メソッドを使用して XML でWriteXmlの内容を書き込む場合は、その内容を DiffGram として読み書きするように指定できます。 詳細については、「XML からの DataSet の読み込み」および「DataSet 内容の XML データとしての書き込み」を参照してください。

.NET Framework では、DiffGram 形式は主に DataSet の内容をシリアル化するときの形式として使用されますが、Microsoft SQL Server データベース内のテーブル データを変更するときにも DiffGrams を使用できます。

diffgram は、すべてのテーブルの内容を <diffgram> 要素に書き込むことで生成されます。

Diffgram を生成するには

  1. ルート テーブル (親を一切持たないテーブル) のリストを生成します。

  2. リストの各テーブルとその子孫について、すべての行の現在のバージョンを最初の Diffgram セクションに書き込みます。

  3. DataSetの各テーブルについて、Diffgram の <before> セクションにすべての行の元のバージョン (存在する場合) を書き出します。

  4. エラーがある行の場合は、Diffgram の <errors> セクションにエラーの内容を書き込みます。

Diffgram は XML ファイルの上から下に向かって処理されます。

Diffgram を処理するには

  1. Diffgram の最初のセクションを処理します。このセクションには、行の現在のバージョンが格納されています。

  2. 変更された行と削除された行の元の行バージョンを含む 2 番目のセクションまたは <before> セクションを処理します。

    行が削除済みとしてマークされていた場合、削除操作によってその行の子孫も削除される場合があります。この点は、現在の CascadeDataSet プロパティに依存します。

  3. <errors> セクションを処理します。 このセクションの各項目について、指定された行および列のエラー情報を設定します。

XmlWriteMode を Diffgram に設定した場合、ターゲット DataSet の内容が、元の DataSet の内容と異なる場合があります。

DiffGram 形式

DiffGram 形式は、現在のデータ、元のデータ (または前のデータ)、エラーの 3 つのセクションから構成されています。DiffGram の例を次に示します。

<?xml version="1.0"?>
<diffgr:diffgram
         xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
         xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">

   <DataInstance>
   </DataInstance>

  <diffgr:before>
  </diffgr:before>

  <diffgr:errors>
  </diffgr:errors>
</diffgr:diffgram>

DiffGram 形式を構成するデータ ブロックについて次に説明します。

< DataInstance> この要素の名前 DataInstance は、このドキュメントの説明のために使用されます。 DataInstance 要素は、DataSetDataTable または行を表します。 実際には DataInstance の代わりに、DataSet または DataTable の名前がこの要素に含まれます。 DiffGram 形式のこのブロックには現在のデータが含まれています。現在のデータは、変更されている場合と未変更の場合があります。 変更されている要素 (行) を識別するため、このような要素には diffgr:hasChanges 注釈が付きます。

<diffgr:before> DiffGram 形式のこのブロックには、元のバージョンの行が含まれています。 このブロックの要素は、diffgr:id 注釈を使用して DataInstance ブロックの内容と対応しています。

<diffgr:errors> DiffGram 形式のこのブロックには、 DataInstance ブロック内の特定の行のエラー情報が含まれています。 このブロックの要素は、diffgr:id 注釈を使用して DataInstance ブロックの内容と対応しています。

DiffGram 注釈

DiffGram では、DataSet の行バージョンやエラー情報を表すさまざまな DiffGram ブロックの要素を関連付けるため、いくつかの注釈が使用されます。

DiffGram 名前空間 urn:schemas-microsoft-com:xml-diffgram-v1 で定義されている DiffGram 注釈を次の表に示します。

注釈 説明
id <diffgr:before>および<diffgr:errors> ブロック内の要素を、<DataInstance> ブロック内の要素とペアリングするために使用します。 diffgr:id 注釈の値は [TableName][RowIdentifier] という形式で指定されます。 たとえば、<Customers diffgr:id="Customers1"> のように指定します。
parentId 現在の要素の親要素である <DataInstance> ブロックの要素を識別します。 diffgr:parentId 注釈の値は [TableName][RowIdentifier] という形式で指定されます。 たとえば、<Orders diffgr:parentId="Customers1"> のように指定します。
hasChanges < DataInstance> ブロックの行を変更済みとして識別します。 hasChanges注釈には、次の 2 つの値のいずれかを指定できます。

挿入
Added行を識別します。

変更
<diffgr:before>ブロック内でOriginal行バージョンを含むModified行を識別します。 Deleted行のOriginal ブロックには<diffgr:before>行バージョンがありますが、<DataInstance> ブロックには注釈付き要素はありません。
hasErrors < DataInstance> ブロック内で RowError がある行を識別します。 error 要素は、 <diffgr:errors> ブロックに配置されます。
Error RowError ブロック内の特定の要素の<diffgr:errors>のテキストを格納します。

DataSet の内容が DiffGram として読み取られる、または書き込まれるときには、上記以外の注釈も含まれます。 名前空間 urn:schemas-microsoft-com:xml-msdata で定義されている追加の注釈を次の表に示します。

注釈 説明
RowOrder 元のデータの行順序を保持し、特定の DataTable の行のインデックスを識別します。
[非表示] ColumnMapping プロパティが MappingType.Hidden に設定されている列を識別します。 この属性は、msdata:hidden[ColumnName]="value" という形式で書き込まれます。 たとえば、<Customers diffgr:id="Customers1" msdata:hiddenContactTitle="Owner"> のように指定します。

データが格納されている隠し列だけが DiffGram 属性として書き込まれます。 それ以外の場合は無視されます。

DiffGram のサンプル

DiffGram 形式の例を次に示します。 この例では、変更のコミット前のテーブル内の行に対する更新結果が示されています。 CustomerID の "ALFKI" である行は変更されていますが、更新されていません。 その結果、Current< ブロックには diffgr:id が "Customers1" の>行があり、Original ブロックには diffgr:id が "Customers1" の<diffgr:before>行があります。 CustomerID が "ANATR" の 行には RowError が含まれているため、diffgr:hasErrors="true" で注釈が付けられています。また、<diffgr:errors> ブロックには関連する要素があります。

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
  <CustomerDataSet>
    <Customers diffgr:id="Customers1" msdata:rowOrder="0" diffgr:hasChanges="modified">
      <CustomerID>ALFKI</CustomerID>
      <CompanyName>New Company</CompanyName>
    </Customers>
    <Customers diffgr:id="Customers2" msdata:rowOrder="1" diffgram:hasErrors="true">
      <CustomerID>ANATR</CustomerID>
      <CompanyName>Ana Trujillo Emparedados y Helados</CompanyName>
    </Customers>
    <Customers diffgr:id="Customers3" msdata:rowOrder="2">
      <CustomerID>ANTON</CustomerID>
      <CompanyName>Antonio Moreno Taquera</CompanyName>
    </Customers>
    <Customers diffgr:id="Customers4" msdata:rowOrder="3">
      <CustomerID>AROUT</CustomerID>
      <CompanyName>Around the Horn</CompanyName>
    </Customers>
  </CustomerDataSet>
  <diffgr:before>
    <Customers diffgr:id="Customers1" msdata:rowOrder="0">
      <CustomerID>ALFKI</CustomerID>
      <CompanyName>Alfreds Futterkiste</CompanyName>
    </Customers>
  </diffgr:before>
  <diffgr:errors>
    <Customers diffgr:id="Customers2" diffgr:Error="An optimistic concurrency violation has occurred for this row."/>
  </diffgr:errors>
</diffgr:diffgram>

関連項目