DiffGrams
DiffGram は、データ要素の現在のバージョンと元のバージョンを識別する XML 形式です。 DataSet では、 の内容を読み込んで永続化するため、およびネットワーク接続経由で転送する場合にこの内容をシリアル化するために、DiffGram 形式が使用されます。 DiffGram として作成された DataSet は、スキーマを使用せずに DataSet の内容を正確に再作成するために必要なすべての情報を DiffGram に格納します。このような情報には、Original 行バージョンと Current 行バージョンの両方の列値、行エラー情報、行順序などが含まれています。
XML Web サービスから DataSet を送信または取得するときには、DiffGram 形式が暗黙的に使用されます。 また、ReadXml メソッドを使用して XML から DataSet の内容を読み取るときや、WriteXml メソッドを使用して XML に DataSet の内容を書き込むときは、読み取りまたは書き込みの形式として DiffGram を指定できます。 詳細については、「XML からの DataSet の読み込み」および「DataSet 内容の XML データとしての書き込み」を参照してください。
.NET Framework では、DiffGram 形式は主に DataSet の内容をシリアル化するときの形式として使用されますが、Microsoft SQL Server データベース内のテーブル データを変更するときにも DiffGrams を使用できます。
Diffgram は、すべてのテーブルの内容を <diffgram> 要素に書き込むことによって生成されます。
Diffgram を生成するには
ルート テーブル (親を一切持たないテーブル) のリストを生成します。
リストの各テーブルとその子孫について、すべての行の現在のバージョンを最初の Diffgram セクションに書き込みます。
DataSet の各テーブルについて、すべての行の元のバージョン (存在する場合) を Diffgram の <before> セクションに書き込みます。
エラーのある行については、そのエラーの内容を Diffgram の <errors> セクションに書き込みます。
Diffgram は XML ファイルの上から下に向かって処理されます。
Diffgram を処理するには
Diffgram の最初のセクションを処理します。このセクションには、行の現在のバージョンが格納されています。
2 番目のセクションまたは <before> セクションを処理します。このセクションには、修正または削除された行の元のバージョンが格納されています。
Note
行が削除済みとしてマークされていた場合、削除操作によってその行の子孫も削除される場合があります。この点は、現在の
Cascade
の DataSet プロパティに依存します。<errors> セクションを処理します。 このセクションの各項目について、指定された行および列のエラー情報を設定します。
Note
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 要素は、DataTable の DataSet または行を表します。 実際には 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 つのうち、いずれかの値を指定できます。 inserted Added 行を識別します。 modified Original 行バージョンが <diffgr:before> ブロックに含まれている Modified 行を識別します。 Deleted 行の場合、対応する Original 行バージョンが <diffgr:before>> ブロックには存在しますが、< DataInstance > ブロックには注釈付き要素が存在しないことに注意してください。 |
hasErrors | < DataInstance > ブロック内で RowError がある行を識別します。 エラー要素は <diffgr:errors> ブロックに挿入されます。 |
Error | <diffgr:errors> ブロック内の特定の要素に関する RowError のテキストが含まれています。 |
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" である行は変更されていますが、更新されていません。 このため、< DataInstance > ブロックに "Customers1" の diffgr:id を持つ Current 行があり、<diffgr:before> ブロックに "Customers1" の diffgr:id を持つ Original 行があります。 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>