Объекты DiffGram (ADO.NET)
DiffGram — это формат XML, определяющий текущую и первоначальную версию элементов данных. Набор данных DataSet использует формат DiffGram для загрузки и хранения своего содержимого, а также для сериализации содержимого перед отправкой его по сетевому подключению. Если набор DataSet записан в формате DiffGram, то он заполняет DiffGram всеми необходимыми данными, чтобы точно воссоздать содержимое (но не схему) набора данных DataSet, включая значения столбцов, как из первоначальной, так и из текущей версий строк, сведения об ошибках строк и порядке строк.
При отправке и получении набора данных DataSet из веб-службы XML формат DiffGram используется неявно. Кроме того, при загрузке содержимого DataSet из XML с помощью метода ReadXml или при записи содержимого DataSet в XML с помощью метода WriteXml можно указывать, что содержимое должно считываться или записываться в формате DiffGram. Дополнительные сведения см. в разделах Загрузка DataSet из XML (ADO.NET) и Запись содержимого DataSet в виде XML-данных (ADO.NET).
Хотя формат DiffGram в основном используется платформой .NET Framework как формат сериализации для содержимого набора данных DataSet, его можно также применять для изменения данных в таблицах базы данных Microsoft SQL Server.
Diffgram формируется путем записи содержимого всех таблиц в элемент <diffgram>.
Создание Diffgram
-
Создайте список корневых таблиц (таблиц, не имеющих родителей).
-
Для каждой таблицы и ее потомков в списке запишите текущую версию всех строк в первом разделе Diffgram.
-
Для каждой таблицы в наборе данных DataSet запишите первоначальную версию всех строк, если она есть, в разделе <before> Diffgram.
-
Для строк, имеющих ошибки, запишите содержимое ошибок в разделе <errors> Diffgram.
Diffgram обрабатывается в последовательном порядке от начала XML-файла до его конца.
Обработка Diffgram
-
Обработайте первый раздел Diffgram, содержащий текущую версию строк.
-
Обработайте второй раздел, или раздел <before>, содержащий первоначальную версию измененных или удаленных строк.
Примечание.Если строка помечена как удаленная, то операция удаления может удалить потомков этой строки в зависимости от свойства Cascade текущего набора данных DataSet.
-
Обработайте раздел <errors>. Установите сведения об ошибках для всех заданных строк и столбцов каждого элемента в этом разделе.
Примечание. |
|---|
|
Если в 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 состоит из следующих блоков данных:
В формате DiffGrams используется несколько заметок для связывания элементов из разных блоков DiffGram, представляющих разные версии строк или сведения об ошибках в DataSet.
В следующей таблице представлены заметки DiffGram, которые определяются в пространстве имен DiffGram urn:schemas-microsoft-com:xml-diffgram-v1.
|
Заметка |
Описание |
|---|---|
|
id |
Используется для сопоставления элементов в блоках <diffgr:before> и <diffgr:errors> с элементами в блоке <DataInstance>. Значения заметки diffgr:id имеют вид [ИмяТаблицы][ИдентификаторСтроки]. Например: <Customers diffgr:id="Customers1">. |
|
parentId |
Определяет, какой элемент из блока <DataInstance> является родительским для текущего элемента. Значения заметки diffgr:parentId имеют вид [ИмяТаблицы][ИдентификаторСтроки]. Например: <Orders diffgr:parentId="Customers1">. |
|
hasChanges |
Определяет строку в блоке <DataInstance> как измененную. Заметка hasChanges может принимать одно из следующих значений. |
|
hasErrors |
Определяет строку в блоке <DataInstance> как строку с элементом ошибки RowError. Элемент ошибки помещается в блок <diffgr:errors>. |
|
Error |
Содержит текст RowError для конкретного элемента в блоке <diffgr:errors>. |
Набор данных DataSet содержит дополнительные заметки при считывании или записи содержимого в формате DiffGram. В следующей таблице представлены дополнительные заметки, которые определены в пространстве имен DiffGram urn:schemas-microsoft-com:xml-msdata.
|
Заметка |
Описание |
|---|---|
|
RowOrder |
Сохраняет порядок строк исходных данных и определяет индекс строки в конкретной таблице DataTable. |
|
Hidden |
Определяет столбец, свойство которого ColumnMapping имеет значение MappingType.Hidden. Этот атрибут записывается в формате msdata:hidden[ИмяСтолбца]="значение". Например: <Customers diffgr:id="Customers1" msdata:hiddenContactTitle="Owner">. Обратите внимание, что скрытые столбцы записываются как атрибут DiffGram только если они содержат данные. В противном случае они пропускаются. |
Ниже показан пример формата DiffGram. На нем показан результат обновления строки в таблице перед фиксацией изменений. Строка с идентификатором пользователя «ALFKI» была изменена, но не обновлена. В результате есть текущая строка с идентификатором diffgr:id «Customers1» в блоке <DataInstance> и первоначальная строка с идентификатором diffgr:id «Customers1» в блоке <diffgr:before>. Строка с идентификатором пользователя «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>