DiffGram
DiffGram 是用于標識數據元素的當前和原始版本的 XML 格式。DataSet 使用 DiffGram 格式來加載和保持其內容,并將其內容序列化,以便通過網絡連接來進行傳輸。當 DataSet 以 DiffGram 形式來編寫時,它會為 DiffGram 填充所有必要的信息,以便精確地重新創建 DataSet 的內容(但不包括其架構),其中包括 Original 和 Current 行版本、行錯誤信息以及行順序的列值。
當從 XML Web 服務發送和檢索 DataSet 時,將隱式地使用 DiffGram 格式。此外,當使用 ReadXml 方法從 XML 中加載 DataSet 的內容,或者使用 WriteXml 方法以 XML 形式編寫 DataSet 的內容時,可以選擇以 DiffGram 格式來讀寫其內容。有關更多信息,請參見從 XML 中加載 DataSet 和以 XML 數據形式編寫 DataSet。
雖然 DiffGram 格式主要由 .NET Framework 用作 DataSet 內容的序列化格式,但也可以使用 DiffGram 來修改 Microsoft SQL Server 數據庫中表的數據。
DiffGram 格式
DiffGram 格式分為三個部分:當前數據、原始(即“before”)數據和錯誤部分,如以下示例所示。
復制代碼 <?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 的行。不過,該元素所包含的并不是 DataInstance,而是 DataSet 或 DataTable 的名稱。此 DiffGram 格式塊包含當前數據(無論是否經過修改)。已修改的元素或行用 diffgr:hasChanges 批注來標識。
此 DiffGram 格式塊包含行的原始版本。使用 diffgr:id 批注將該塊中的元素與 DataInstance 塊中的元素進行匹配。
此 DiffGram 格式塊包含 DataInstance 塊中特定行的錯誤信息。使用 diffgr:id 批注將該塊中的元素與 DataInstance 塊中的元素進行匹配。
DiffGram 批注
DiffGram 使用一些批注來使來自不同 DiffGram 塊的元素相關,這些塊表示 DataSet 中的不同行版本或錯誤信息。
下表描述在 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 批注可以具有以下三個值之一: inserted標識 Added 行。 標識包含 <diffgr:before> 塊中 Original 行版本的 Modified 行。請注意,Deleted 行將包含 <diffgr:before> 塊中的 Original 行版本,但 <DataInstance> 塊中將不存在批注元素。 標識其中有一個或多個來自父子關系的子級已被修改的元素。 |
| hasErrors | 用 RowError 標識 <DataInstance> 塊中的行。錯誤元素放置在 <diffgr:errors> 塊中。 |
| Error | 包含 <diffgr:errors> 塊中特定元素的 RowError 的文本。 |
當以 DiffGram 格式讀寫 DataSet 的內容時,還包含附加的批注。下表描述在 urn:schemas-microsoft-com:xml-msdata 命名空間中定義的三個附加批注。
| RowOrder | 保留原始數據的行順序并標識特定 DataTable 中行的索引。 |
| Hidden | 將列標識為 ColumnMapping 屬性設置為 MappingType.Hidden。該屬性以 msdata:hidden[ColumnName]="value" 格式編寫。例如:<Customers diffgr:id="Customers1" msdata:hiddenContactTitle="Owner">。 請注意,只有當隱藏列包含數據時才以 DiffGram 屬性的形式來編寫隱藏列。否則將忽略隱藏列。 |
DiffGram 示例
下面是 DiffGram 格式的示例。該示例顯示對表行的更新在提交更改之前的結果。CustomerID 為“ALFKI”的行已被修改,但尚未更新。因此,<DataInstance> 塊中有一個 diffgr:id 為“Customers1”的 Current 行,<diffgr:before> 塊中有一個 diffgr:id 為“Customers1”的 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>轉載于:https://www.cnblogs.com/KimSky/archive/2009/04/16/1436880.html
總結