Книга: Обработка баз данных на Visual Basic®.NET

Формат DiffCram

Формат DiffCram

Рассмотрим теперь формат DiffGram, который используется членами перечислений XmlReadMode и XmlWriteMode. Это XML-формат, содержащий не только текущие значения элементов-данных, но и их исходные значения, которые были изменены или удалены (вслед за последним вызовом метода AcceptChanges). Итак, DiffGram представляет собой формат сериализации, который используется для передачи данных другому процессу или компьютеру. Поскольку эти данные фактически имеют XML-формат, они могут легко передаваться другим платформам, например UNIX или Linux.

Каждый файл формата DiffGram имеет три раздела. Первый раздел содержит текущие значения всех записей объекта DataSet, независимо от того, изменялись они или нет. Любой измененный элемент (запись) обозначается как diffgr:hasChanges="modified", а любой добавленный элемент (запись) — как diffgr:hasChanges="inserted". Второй раздел содержит исходные значения всех измененных и удаленных записей. Его элементы связаны с соответствующими элементами первого раздела, которые обозначаются как diffgr:id="xxx", где ххх — идентификатор записи. Третий раздел содержит информацию об ошибках работы с записями. Его элементы связаны аналогичным образом с соответствующими элементами первого раздела, которые обозначаются как diffgr:id="xxx".

Для генерации XML-файла в формате DiffGram нужно внести приведенные ниже изменения (они обозначены полужирным начертанием) в подпрограмму btnWriteXML_Click.H3 листинга 10.3.

Private Sub btnWriteXML_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles btnWriteXML.Click
 Dim dsSales As New DataSet()
 Dim en As New SqlConnection _
  ("data source=localhost;initial catalog=pubs;user>

 Dim daAuthors As New SqlDataAdapter("select * from sales ", en)
 Dim daPublishers As New SqlDataAdapter("select * from stores ", en)
 ' Загрузка реляционных данных из базы данных.
 daAuthors.Fill(dsSales, "Sales")
 daPublishers.Fill(dsSales, "Stores")
 ' Запись XML-данных в файл.
 dsSales.WriteXml("..StoreSales.xml")
 ' Запись схемы в XSD-файл.
 dsSales.WriteXmlSchema("..StoreSales.xsd")
 ' Пример изменения, удаления и вставки новой записи.
 dsSales.Tables("Stores").Rows(0)("stor_id") = 999 ' Изменение
 dsSales.Tables("Stores").Rows(1).Delete() ' Удаление
 Dim rr As DataRow = dsSales.Tables("Stores").NewRow()
 rr("stor_name") = "New Store"
 dsSales.Tables("Stores").Rows.Add(rr) ' Вставка
 ' Сохранение только измененных записей в формате DiffGram.
 Dim ChangedDataSet = dsSales.GetChanges()
 ChangedDataSet.WriteXml("…Changes.xml", XmlWriteMode.DiffGram)
 ' Сохранение всех записей в формате DiffGram.
 dsSales.WriteXml("…DiffGram.xml", XmlWriteMode.DiffGram)
End Sub

В листинге 10.6 приведено содержимое файла DiffGram.xml, полученного в результате щелчка на кнопке Write XML формы проекта ADO-XML. Внесенные в таблицу Stores изменения выделены полужирным начертанием. Удаленная запись отсутствует в разделе текущих данных, но присутствует в разделе исходного состояния вместе с исходным значением измененной записи. Кроме того, раздел с текущими данными содержит новую запись с отметкой "inserted" (вставлена).

Листинг 10.6. XML-файл DiffGram.xml в формате DiffGram с одной вставленной записью, одной удаленной записью и одной измененной записью

<?xml version="1.0" standalone="yes"?>
<diffgr:diffgram xmlns:msdata="urn:schemes-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
 <NewDataSet>
  <Sales diffgr:id="Sales1" msdata:rowOrder="0">
   <stor_id>6380</stor_id>
   <ord_num>6871</ord_num>
   <ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
   <qty>5</qty>
   <payterms>Net 60</payterms>
   <title_id>BU1032</title_id>
  </Sales>
  <Sales diffgr:id="Sales2" msdata:rowOrder="1">
   <stor_id>6380</stor_id>
   <ord_num>722a</ord_num>
   <ord_date>1994-09-13T00:00:00.0000000+02:00</ord_date>
   <qty>3</qty>
   <payterms>Net 60</payterms>
   <title_id>PS2091</title_id>
  </Sales>
  <Sales diffgr:id="Sales3" msdata:rowOrder="2">
   <stor_id>7066</stor_id>
   <ord_num>A2976</ord_num>
   <ord_date>1993-05-24T00:00:00.0000000+02:00</ord_date>
   <qty>50</qty>
   <payterms>Net 30</payterms>
   <title_id>PC8888</title_id>
  </Sales>
  <Sales diffgr:id="Sales4" msdata:rowOrder="3">
   <stor_id>7066</stor_id>
   <ord_num>QA7442.3</ord_num>
   <ord_date>1994-09-13T00:00:00.0000000+02:00</ord_date>
   <qty>75</qty>
   <payterms>ON invoice</payterms>
   <title_id>PS2091</title_id>
  </Sales>
  <Sales diffgr:id="Sales5" msdata:rowOrder="4">
   <stor_id>7067</stor_id>
   <ord_num>D4482</ord_num>
   <ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
   <qty>10</qty>
   <payterms>Net 60</payterms>
   <title_id>PS2091</title_id>
  </Sales>
  <Sales diffgr:id="Sales6" msdata:rowOrder="5">
   <stor_id>7067</stor_id>
   <ord_num>P2121</ord_num>
   <ord_date>1992-06-15T00:00:00.0000000+02:00</ord_date>
   <qty>40</qty>
   <payterms>Net 30</payterms>
   <title_id>TC3218</title_id>
  </Sales>
  <Sales diffgr:id="Sales7" msdata:rowOrder="6">
   <stor_id>7067</stor_id>
   <ord_num>P2121</ord_num>
   <ord_date>1992-06-15T00:00:00.0000000+02:00</ord_date>
   <qty>20</qty>
   <payterms>Net 30</payterms>
   <title_id>TC4203</title_id>
  </Sales>
  <Sales diffgr:id="Sales8" msdata:rowOrder="7">
   <stor_id>7067</stor_id>
   <ord_num>P2121</ord_num>
   <ord_date>1992-06-15T00:00:00.0000000+02:00</ord_date>
   <qty>20</qty>
   <payterms>Net 30</payterms>
   <title_id>TC7777</title_id>
  </Sales>
  <Sales diffgr:id="Sales9" msdata:rowOrder="8">
   <stor_id>713K/stor_id>
   <ord_num>N914008</ord_num>
   <ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
   <qty>20</qty>
   <payterms>Net 30</payterms>
   <title_id>PS2091</title_id>
  </Sales>
  <Sales diffgr:id="Sales10" msdata:rowOrder="9">
   <stor_id>7131</stor_id>
   <ord_num>N914014</ord_num>
   <ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
   <qty>25</qty>
   <payterms>Net 30</payterms>
   <title_id>MC3021</title_id>
  </Sales>
  <Sales diffgr:id="Sales11" msdata:rowOrder="10">
   <stor_id>7131</stor_id>
   <ord_num>P3087a</ord_num>
   <ord_date>1993-05-29T00:00:00.0000000+02:00</ord_date>
   <qty>20</qty>
   <payterms>Net 60</payterms>
   <title_id>PS1372</title_id>
  </Sales>
  <Sales diffgr:id="Sales12" msdata:rowOrder="11">
   <stor_id>7131</stor_id>
   <ord_num>P3087a</ord_num>
   <ord_date>1993-05-29T00:00:00.0000000+02:00</ord_date>
   <qty>25</qty>
   <payterms>Net 60</payterms>
   <title_id>PS2106</title_id>
  </Sales>
  <Sales diffgr:id="Sales13" msdata:rowOrder="12">
   <stor_id>7131</stor_id>
   <ord_num>P3087a</ord_num>
   <ord_date>1993-05-29T00:00:00.0000000+02:00</ord_date>
   <qty>15</qty>
   <payterms>Net 60</payterms>
   <title_id>PS3333</title_id>
  </Sales>
  <Sales diffgr:id="Sales14" msdata:rowOrder="13">
   <stor_id>7131</stor_id>
   <ord_num>P3087a</ord_num>
   <ord_date>1993-05-29T00:00:00.0000000+02:00</ord_date>
   <qty>25</qty>
   <payterms>Net 60</payterms>
   <title_id>PS7777</title_id>
  </Sales>
  <Sales diffgr:id="Sales15" msdata:rowOrder="14">
   <stor_id>7896</stor_id>
   <ord_num>QQ2299</ord_num>
   <ord_date>1993-10-28T00:00:00.0000000+02:00</ord_date>
   <qty>15</qty>
   <payterms>Net 60</payterms>
   <title_id>BU7832</title_id>
  </Sales>
  <Sales diffgr:id="Sales16" msdata:rowOrder="15">
   <stor_id>7896</stor_id>
   <ord_num>TQ456</ord_num>
   <ord_date>1993-12-12T00:00:00.0000000+02:00</ord_date>
   <qty>10</qty>
   <payterms>Net 60</payterms>
   <title_id>MC2222</title_id>
  </Sales>
  <Sales diffgr:id="Sales17" msdata:rowOrder="16">
   <stor_id>7896</stor_id>
   <ord_num>X999</ord_num>
   <ord_date>1993-02-21T00:00:00.0000000+02:00</ord_date>
   <qty>35</qty>
   <payterms>ON invoice</payterms>
   <title_id>BU2075</title_id>
  </Sales>
  <Sales diffgr:id="Sales18" msdata:rowOrder="17">
   <stor_id>8042</stor_id>
   <ord_num>423LL922</ord_num>
   <ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
   <qty>15</qty>
   <payterms>ON invoice</payterms>
   <title_id>MC3021</title_id>
  </Sales>
  <Sales diffgr:id="Sales19" msdata:rowOrder="18">
   <stor_id>8042</stor_id>
   <оrd_num>423LL930</ord_num>
   <ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
   <qty>10</qty>
   <payterms>ON invoice</payterms>
   <title_id>BU1032</title_id>
  </Sales>
  <Sales diffgr:id="Sales20" msdata:rowOrder="19">
   <stor_id>8042</stor_id>
   <ord_num>P723</ord_num>
   <ord_date>1993-03-11T00:00:00.0000000+02:00</ord_date>
   <qty>25</qty>
   <payterms>Net 30</payterms>
   <title_id>BU1111</title_id>
  </Sales>
  <Sales diffgr:id="Sales21" msdata:rowOrder="20">
   <stor_id>8042</stor_id>
   <ord_num>QA879.1</ord_num>
   <ord_date>1993-05-22T00:00:00.0000000+02:00</ord_date>
   <qty>30</qty>
   <payterms>Net 30</payterms>
   <title_id>PC1035</title_id>
  </Sales>
  <Stores diffgr:id="Stores1" msdata:rowOrder="0" diffgr:hasChanges="modified">
   <stor_id>999</stor_id>
   <stor_name>Eric the Read Books</stor_name>
   <stor_address>788 Catamaugus Ave.</stor_address>
   <city>Seattle</city>
   <state>WA</state>
   <zip>98056</zip>
  </Stores>
  <Stores diffgr:id="Stores3" msdata:rowOrder="2">
   <stor_id>7067</stor_id>
   <stor_name>News & Brews</stor_name>
   <stor_address>577 First St.</stor_address>
   <city>Los Gatos</city>
   <state>CA</state>
   <zip>96745</zip>
  </Stores>
  <Stores diffgr:id="Stores4" msdata:rowOrder="3">
   <stor_id>7131</stor_id>
   <stor_name>Doc-U-Mat: Quality Laundry and Books</stor_name>
   <stor_address>24-A Avogadro Way</stor_address>
   <city>Remulade</city>
   <state>WA</state>
   <zip>98014</zip>
  </Stores>
  <Stores diffgr:id="Stores5" msdata:rowOrder="4">
   <stor_id>7896</stor_id>
   <stor_name>Fricative Bookshop</stor_name>
   <stor_address>89 Madison St.</stor_address>
   <city>Fremont</city>
   <state>CA</state>
   <zip>90019</zip>
  </Stores>
  <Stores diffgr:id="Stores6" msdata:rowOrder="5">
   <stor_id>8042</stor_id>
   <stor_name>Bookbeat</stor_name>
   <stor_address>679 Carson St.</stor_address>
   <city>Portland</city>
   <state>OR</state>
   <zip>89076</zip>
  </Stores>
  <Stores diffgr:id="Stores7" msdata:rowOrder="6" diffgr:hasChanges="inserted">
   <stor_name>New Store</stor_name>
  </Stores>
 </NewDataSet>
 <diffgr:before>
  <Stores diffgr:id="Stores1" msdata:rowOrder="0">
   <stor_id>6380</stor_id>
   <stor_name>Eric the Read Books</stor_name>
   <stor_address>788 Catamaugus Ave.</stor_address>
   <city>Seattle</city>
   <state>WA</state>
   <zip>98056</zip>
  </Stores>
  <Stores diffgr:id="Stores2" msdata:rowOrder="1">
   <stor_id>7066</stor_id>
   <stor_name>Barnum's</stor_name>
   <stor_address>567 Pasadena Ave.</stor_address>
   <city>Tustin</city>
   <state>CA</state>
   <zip>92789</zip>
  </Stores>
 </diffgr:before>
</diffgr:diffgram>

НА ЗАМЕТКУ

Для сохранения только измененных записей в формате DiffGram следует использовать метод GetChanges:

Dim ChangedDataSet = dsSales.GetChanges()
ChangedDataSet.WriteXml("..Changes.xml", XmlWriteMode.DiffGram)

В листинге 10.7 приведено содержимое файла DiffGram.xml, полученного в pезультате выполнения этого метода. 

Листинг 10.7. XML-файл changes.xml в формате DiffGram только с измененными записями

<?xml version="1.0" standalone="yes"?>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
 <NewDataSet>
  <Stores diffgr:id="Stores1" msdata:rowOrder="0" diffgr:hasChanges="modified">
   <stor_id>999</stor_fd>
   <stor_name>Eric the Read Books</stor_name>
   <stor_address>788 Catamaugus Ave.</stor_address>
   <city>Seattle</city>
   <state>WA</state>
   <zip>98056</zip>
  </Stores>
  <Stores diffgr:id="Stores3" msdata:rowOrder="2" diffgr:hasChanges="inserted">
   <stor_name>New Store</stor_name>
  </Stores>
 </NewDataSet>
 <diffgr:before>
  <Stores diffgr:id="Stores1" msdata:rowOrder="0">
   <stor_id>6380</stor_id>
   <stor_name>Eric the Read Books</stor_name>
   <stor_address>788 Catamaugus Ave.</stor_address>
   <city>Seattle</city>
   <state>WA</state>
   <zip>98056</zip>
  </Stores>
  <Stores diffgr:id="Stores2" msdata:rowOrder="1">
   <stor_id>7066</stor_id>
   <stor_name>Barnum's</stor__name>
   <stor_address>567 Pasadena Ave.</stor_address>
   <city>Tustin</city>
   <state>CA</state>
   <zip>92789</zip>
  </Stores>
 </diffgr:before>
</diffgr:diffgram>

Оглавление книги


Генерация: 1.094. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз