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