DiffGram 是用于标识数据元素的当前和原始版本的 XML 格式。
DataSet 使用 DiffGram 格式来加载和保持其内容,并将其内容序列化,以便通过网络连接来进行传输。
DataSet编写为 DiffGram 时,它会使用所有必要的信息填充 DiffGram,以准确重新创建DataSet的内容(而不是架构),包括Original和Current行版本中的列值、行错误信息和行顺序。
当从 XML Web services 发送和检索 DataSet 时,将隐式地使用 DiffGram 格式。 此外,当使用DataSet方法从 XML 加载ReadXml的内容,或使用WriteXml方法将内容写入DataSet至 XML 时,可以指定内容以 DiffGram 形式读取或写入。 有关详细信息,请参阅 从 XML 加载数据集 和将 数据集内容编写为 XML 数据。
虽然 DiffGram 格式主要由 .NET Framework 用作 DataSet 内容的序列化格式,但也可以使用 DiffGram 来修改 Microsoft SQL Server 数据库中表的数据。
Diffgram 是通过将所有表的内容写入 <diffgram> 元素来生成的。
生成 Diffgram
生成根表(即没有任何父级的表)的列表。
对于列表中每个表及其子代,在 Diffgram 的第一部分中写出所有行的当前版本。
对于每个 DataSet表,请写出 Diffgram 节中所有行的原始版本(如果有
<before>)。对于有错误的行,请将错误内容写入 Diffgram 的
<errors>节。
将按照从 XML 文件的开头到结尾的顺序处理 Diffgram。
处理 Diffgram
处理包含行当前版本的 Diffgram 的第一部分。
处理第二个或
<before>节,该节包含已修改和已删除行的原始行版本。备注
如果某行标记为已删除,则删除操作还可删除该行的子代,具体取决于当前
Cascade的 DataSet 属性。处理
<errors>部分。 为本部分中各项的指定行和列设置错误信息。
备注
如果将 XmlWriteMode 设置为 Diffgram,则目标 DataSet 和原始 DataSet 的内容可能会不同。
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 的行。 不过,该元素所包含的并不是 DataInstance,而是 DataSet 或 DataTable 的名称。 此 DiffGram 格式块包含当前数据(无论是否经过修改)。 已修改的元素或行用 diffgr:hasChanges 批注来标识。
diffgr:在 DiffGram 格式的此块包含行的原始版本之前<。> 使用 diffgr:id 批注将该块中的元素与 DataInstance 块中的元素进行匹配。
<diffgr:errors> 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 批注的值的格式为 。 例如:<Customers diffgr:id="Customers1">。 |
parentId |
标识 < DataInstance 块中的哪个元素是当前元素的父元素。 带有 diffgr:parentId 批注的值的格式为 。 例如:<Orders diffgr:parentId="Customers1">。 |
hasChanges |
将 < DataInstance 块中的行标识为已修改。 注释 hasChanges 可以具有以下两个值之一:插入 标识一个 Added行已修改 标识在 <diffgr:before>块中包含Original行版本的Modified行。 请注意,Deleted行在<diffgr:before>块中具有Original行版本,但在<块中>没有注释元素。 |
hasErrors |
用 RowError< 标识 DataInstance 块中的行。> 错误元素被放置在<diffgr:errors>块中。 |
Error |
包含<diffgr:errors>块中特定元素RowError的文本。 |
当以 DiffGram 格式读写 DataSet 的内容时,还包含附加的批注。 下表描述在 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>块中,有一行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>