DiffGrams

DiffGram - это формат XML, определяющий текущую и первоначальную версию элементов данных. Набор данных DataSet использует формат DiffGram для загрузки и хранения своего содержимого, а также для сериализации содержимого перед отправкой его по сетевому подключению. DataSet При написании как DiffGram он заполняет DiffGram всеми необходимыми сведениями для точного создания содержимого, хотя и не схемы, включая значения столбцов из исходных и текущих версий строк, DataSetсведения об ошибках строки и порядок строк.

При отправке и получении набора данных DataSet из веб-службы XML формат DiffGram используется неявно. Кроме того, при загрузке содержимого DataSet из XML с помощью метода ReadXml или при написании содержимого DataSet в XML с помощью метода WriteXml можно указать, что содержимое должно быть прочитано или записано как DiffGram. Дополнительные сведения см. в разделе "Загрузка набора данных из XML и запись содержимого набора данных в виде XML-данных".

Хотя формат DiffGram в основном используется платформой .NET Framework как формат сериализации для содержимого набора данных DataSet, его можно также применять для изменения данных в таблицах базы данных Microsoft SQL Server.

Diffgram создается путем записи содержимого всех таблиц в элемент diffgram>.<

Создание Diffgram

  1. Создайте список корневых таблиц (таблиц, не имеющих родителей).

  2. Для каждой таблицы и ее потомков в списке запишите текущую версию всех строк в первом разделе Diffgram.

  3. Для каждой таблицы в DataSetтаблице выпишите исходную версию всех строк, если таковые есть, в <разделе Diffgram> .

  4. Для строк с ошибками напишите содержимое ошибки в <разделе об ошибках> Diffgram.

Diffgram обрабатывается в последовательном порядке от начала XML-файла до его конца.

Обработка Diffgram

  1. Обработайте первый раздел Diffgram, содержащий текущую версию строк.

  2. Обработайте второй или предыдущий <> раздел, содержащий исходную версию измененных и удаленных строк.

    Примечание.

    Если строка помечена как удаленная, то операция удаления может удалить потомков этой строки в зависимости от свойства Cascade текущего набора данных DataSet.

  3. Обработайте <раздел ошибок> . Установите сведения об ошибках для всех заданных строк и столбцов каждого элемента в этом разделе.

Примечание.

Если в Diffgram задан режим XmlWriteMode, то содержимое целевого набора DataSet и исходного набора DataSet могут различаться.

Формат дельт

Формат 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объекта. Вместо DataInstance элемент будет содержать имя DataSet илиDataTable. Этот блок формата DiffGram содержит текущие данные, независимо от изменений в этих данных. Элемент или строка, которая была изменена, идентифицируется с заметкой diffgr:hasChanges .

<diffgr:before>
Этот блок формата DiffGram содержит первоначальную версию строки. Элементы в этом блоке сопоставляются с элементами блока DataInstance с помощью заметки diffgr:id .

<diffgr:errors>
Этот блок формата DiffGram содержит сведения об ошибке для определенной строки в блоке DataInstance . Элементы в этом блоке сопоставляются с элементами блока DataInstance с помощью заметки diffgr:id .

Заметки дельт

В формате DiffGrams используется несколько заметок для связывания элементов из разных блоков DiffGram, представляющих разные версии строк или сведения об ошибках в DataSet.

В следующей таблице описаны заметки DiffGram, определенные в пространстве имен DiffGram urn:schemas-microsoft-com:xml-diffgram-v1.

Номер Description
id Используется для связывания элементов в блоке DataInstance в блоке <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 может иметь одно из следующих двух значений:

Вставлен
Определяет добавленную строку.

Изменения
Определяет измененную строку, содержащую исходную версию строки в блоке <diffgr:before>. Обратите внимание, что удаленные строки будут иметь исходную версию строки в блоке <diffgr:before> block, но в блоке< DataInstance> не будет аннотированного элемента.
hasErrors Определяет строку в блоке <DataInstance> с помощью RowError. Элемент error помещается в <блок diffgr:errors> .
Ошибка Содержит текст RowError для определенного элемента в блоке< diffgr:errors>.

Набор данных DataSet содержит дополнительные заметки при считывании или записи содержимого в формате DiffGram. В следующей таблице описываются эти дополнительные заметки, определенные в пространстве имен urn:schemas-microsoft-com:xml-msdata.

Номер Description
RowOrder Сохраняет порядок строк исходных данных и определяет индекс строки в конкретной таблице DataTable.
Скрыта Определяет столбец как имеющий свойство ColumnMapping , которое имеет значение MappingType.Hidden. Атрибут записывается в формате msdata:hidden[ColumnName]="value". Например: <Customers diffgr:id="Customers1" msdata:hiddenContactTitle="Owner">.

Обратите внимание, что скрытые столбцы записываются как атрибут DiffGram только если они содержат данные. В остальных случаях этот параметр игнорируется.

Образец DiffGram

Ниже показан пример формата DiffGram. На нем показан результат обновления строки в таблице перед фиксацией изменений. Строка с идентификатором пользователя «ALFKI» была изменена, но не обновлена. В результате в блоке DataInstance имеется текущая строка с идентификатором diffgr:id "Customers1" и исходной строкой с идентификатором diffgr:id "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>  

См. также