DiffGrams

DiffGram 是用于标识数据元素的当前和原始版本的 XML 格式。 DataSet 使用 DiffGram 格式来加载和保持其内容,并将其内容序列化,以便通过网络连接来进行传输。 DataSet编写为 DiffGram 时,它会使用所有必要的信息填充 DiffGram,以准确重新创建DataSet的内容(而不是架构),包括OriginalCurrent行版本中的列值、行错误信息和行顺序。

当从 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

  1. 生成根表(即没有任何父级的表)的列表。

  2. 对于列表中每个表及其子代,在 Diffgram 的第一部分中写出所有行的当前版本。

  3. 对于每个 DataSet表,请写出 Diffgram 节中所有行的原始版本(如果有 <before> )。

  4. 对于有错误的行,请将错误内容写入 Diffgram 的 <errors> 节。

将按照从 XML 文件的开头到结尾的顺序处理 Diffgram。

处理 Diffgram

  1. 处理包含行当前版本的 Diffgram 的第一部分。

  2. 处理第二个或 <before> 节,该节包含已修改和已删除行的原始行版本。

    备注

    如果某行标记为已删除,则删除操作还可删除该行的子代,具体取决于当前 CascadeDataSet 属性。

  3. 处理<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,而是 DataSetDataTable 的名称。 此 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>

请参阅