Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
DiffGram - это формат XML, определяющий текущую и первоначальную версию элементов данных. Набор данных DataSet использует формат DiffGram для загрузки и хранения своего содержимого, а также для сериализации содержимого перед отправкой его по сетевому подключению.
DataSet Когда объект записывается как DiffGram, он заполняет DiffGram всеми необходимыми данными, чтобы точно воссоздать содержимое, хотя без схемы, включая значения столбцов из версий строк DataSet и Original, сведения об ошибках строк и порядок строк.
При отправке и получении набора данных DataSet из веб-службы XML формат DiffGram используется неявно. Кроме того, при загрузке содержимого DataSet из XML с помощью ReadXml метода или при написании содержимого DataSet в ФОРМАТЕ XML с помощью WriteXml метода можно указать, что содержимое будет прочитано или записано как DiffGram. Дополнительные сведения см. в разделе "Загрузка набора данных из XML и запись содержимого набора данных в виде XML-данных".
Хотя формат DiffGram в основном используется платформой .NET Framework как формат сериализации для содержимого набора данных DataSet, его можно также применять для изменения данных в таблицах базы данных Microsoft SQL Server.
Diffgram создается путем записи содержимого всех таблиц в элемент <diffgram>.
Создание Diffgram
Создайте список корневых таблиц (таблиц, не имеющих родителей).
Для каждой таблицы и ее потомков в списке запишите текущую версию всех строк в первом разделе Diffgram.
Для каждой таблицы в DataSet таблице запишите исходную версию всех строк, если таковые есть, в
<before>разделе Diffgram.Для строк с ошибками напишите содержимое ошибки в
<errors>разделе Diffgram.
Diffgram обрабатывается в последовательном порядке от начала XML-файла до его конца.
Обработать Diffgram
Обработайте первый раздел Diffgram, содержащий текущую версию строк.
Обработайте второй или
<before>раздел, содержащий исходную версию строк, которые были изменены или удалены.Примечание.
Если строка помечена как удаленная, то операция удаления может удалить потомков этой строки в зависимости от свойства
Cascadeтекущего DataSet.Обработайте
<errors>раздел. Установите сведения об ошибках для всех заданных строк и столбцов каждого элемента в этом разделе.
Примечание.
Если установить XmlWriteMode в режим Diffgram, содержимое целевого элемента DataSet и исходного элемента DataSet могут различаться.
Формат DiffGram
Формат 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:до> Этот блок формата DiffGram содержит исходную версию строки. Элементы в этом блоке сопоставляются с элементами блока DataInstance с помощью заметки diffgr:id .
<diffgr:errors> Этот блок формата DiffGram содержит сведения об ошибках для определенной строки в блоке DataInstance . Элементы в этом блоке сопоставляются с элементами блока DataInstance с помощью заметки diffgr:id .
Аннотации DiffGram
В формате DiffGrams используется несколько аннотаций для связывания элементов из разных блоков DiffGram, представляющих разные версии строк или информацию об ошибках в DataSet.
В следующей таблице описаны аннотации DiffGram, определенные в пространстве имен DiffGram urn:schemas-microsoft-com:xml-diffgram-v1.
| Аннотация | Описание |
|---|---|
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 может иметь одно из следующих двух значений:Вставлен Определяет Added строку.модифицированный Определяет строку Modified, содержащую версию строки Original в блоке <diffgr:before>. Обратите внимание, что Deleted строки будут иметь Original версию строки в блоке <diffgr:before>, но в блоке <DataInstance> нет аннотированного элемента. |
hasErrors |
Определяет строку в блоке <DataInstance>, где существует RowError. Элемент ошибки помещается в <diffgr:errors> блок. |
Error |
Содержит текст RowError, относящийся к конкретному элементу в блоке <diffgr:errors>. |
Набор данных DataSet содержит дополнительные аннотации при считывании или записи данных в формате DiffGram. В следующей таблице описываются дополнительные аннотации, определенные в пространстве имен 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. На нем показан результат обновления строки в таблице перед фиксацией изменений. Строка с идентификатором пользователя «ALFKI» была изменена, но не обновлена. В результате в блоке Current< имеется строка с идентификатором diffgr:id "Customers1" > и Original строкой с diffgr:id "Customers1" в блоке<diffgr:before>. Строка с 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>