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
Создайте список корневых таблиц (таблиц, не имеющих родителей).
Для каждой таблицы и ее потомков в списке запишите текущую версию всех строк в первом разделе Diffgram.
Для каждой таблицы в DataSetтаблице выпишите исходную версию всех строк, если таковые есть, в <разделе Diffgram> .
Для строк с ошибками напишите содержимое ошибки в <разделе об ошибках> Diffgram.
Diffgram обрабатывается в последовательном порядке от начала XML-файла до его конца.
Обработка Diffgram
Обработайте первый раздел Diffgram, содержащий текущую версию строк.
Обработайте второй или предыдущий <> раздел, содержащий исходную версию измененных и удаленных строк.
Примечание.
Если строка помечена как удаленная, то операция удаления может удалить потомков этой строки в зависимости от свойства
Cascade
текущего набора данных DataSet.Обработайте <раздел ошибок> . Установите сведения об ошибках для всех заданных строк и столбцов каждого элемента в этом разделе.
Примечание.
Если в 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>