DiffGram 是 XML 格式,可用來識別資料項目的目前和原始版本。
DataSet 使用 DiffGram 格式以載入保存內容,並將內容序列化以透過網路連接傳輸。 當DataSet以DiffGram形式寫入時,會將所有必要的資訊填入DiffGram,以準確重現DataSet的內容,但不包括結構,其中包括來自Original和Current列版本的欄位值、列錯誤資訊及列序。
從 XML Web Service 傳送和擷取 DataSet 時,會隱含使用 DiffGram 格式。 此外,使用 ReadXml 方法從 XML 載入 DataSet 的內容,或使用 WriteXml 方法將內容寫入 DataSet 時,可以指定內容以 DiffGram 形式讀取或寫入。 如需詳細資訊,請參閱從 XML 載入資料集與將資料集內容寫入為 XML 資料。
雖然 DiffGram 格式在 .NET Framework 中主要是用來當做 DataSet 內容的序列化格式,您也可以使用 DiffGrams 修改 Microsoft SQL Server 資料庫中的資料表資料。
Diffgram 是透過將所有資料表的內容寫入一個 <diffgram> 元素來產生的。
若要產生 Diffgram
產生根資料表 (即不具任何父項目的資料表) 的清單。
針對清單中的每個資料表及其子代 (Descendant),在 Diffgram 的第一個區段中寫出所有資料列的目前版本。
對於 DataSet 中的每個表格,請在 Diffgram 區段的
<before>中寫出所有列的原始版本(若有的話)。對於有錯誤的列,請將錯誤內容寫入
<errors>Diffgram 的區段。
Diffgram 會從 XML 檔案的開頭依序處理到結尾。
若要處理 Diffgram
處理 Diffgram 的第一個區段,其中包含資料列的目前版本。
處理第二個區段或
<before>區段,兩者均包含已修改與刪除列的原始列版本。注意
如果資料列標示為已刪除,則刪除作業可能也會刪除該資料列的子代,根據目前
Cascade的 DataSet 屬性而定。處理該
<errors>區段。 針對此區段中每個項目的指定資料列和資料行設定錯誤資訊。
注意
如果將 XmlWriteMode 設定為 Diffgram,則目標 DataSet 和原始 DataSet 的內容可能不同。
DiffGram 格式
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 元素代表 DataSet 或 DataTable 的資料列。 項目會包含 或 DataSet 的名稱 (而非 DataTable)。 無論這個 DiffGram 格式區塊是否經過修改,都會包含目前的資料。 已修改過的項目或資料列是以 diffgr:hasChanges 註釋來識別。
<diffgr:before> 此DiffGram格式的區塊包含一列的原始版本。 此區塊的項目會使用 diffgr:id 註釋,對應至 DataInstance 區塊的元素。
<diffgr:errors> DiffGram 格式的此區塊包含 DataInstance 區塊中特定列的錯誤資訊。 此區塊的項目會使用 diffgr:id 註釋,對應至 DataInstance 區塊的元素。
DiffGram 註釋
DiffGram 使用數種註釋,將來自不同 DiffGram 區塊的項目關聯起來,這些 DiffGram 區塊分別代表 DataSet 中的不同資料列版本或錯誤訊息。
下列表格說明 DiffGram 命名空間 urn:schemas-microsoft-com:xml-diffgram-v1 定義的 DiffGram 註釋。
| 註釋 | 描述 |
|---|---|
id |
用於將 和 <diffgr:before> 區塊中的<diffgr:errors>元素配對到 < 區塊中的>元素。 具有 diffgr:id 註釋的值使用 [TableName][RowIdentifier] 格式。 例如: <Customers diffgr:id="Customers1"> 。 |
parentId |
識別 <DataInstance> 區塊哪個元素是目前元素的父元素。 具有 diffgr:parentId 註釋的值使用 [TableName][RowIdentifier] 格式。 例如: <Orders diffgr:parentId="Customers1"> 。 |
hasChanges |
將 <DataInstance> 區塊的資料列識別為已修改。 註解 hasChanges 可以有以下兩種值之一:插入 識別出一 Added 列。修改 識別在 <diffgr:before> 區塊中包含 Original 列版本的 Modified 一列。 請注意,Deleted 資料列在 <diffgr:before> 區塊中會有 Original 列版本,但在 <DataInstance> 區塊中不會有註解元素。 |
hasErrors |
使用 < 識別 > 區塊的資料列。 誤差元素會被放置在區塊中 <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<DataInstance> 區塊中,有一個 diffgr:id 為「Customers1」的列,另在 <diffgr:before> 區塊中,也有一個 Original 為「Customers1」的列。 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>