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

Запись XML-данных

Запись XML-данных

После загрузки в объект DataSet (независимо от способа и места загрузки) данные и/или схемы данных можно записать в XML-формате (с XML-схемой или без нее). Для демонстрации способов записи данных в XML-формате выполните перечисленные ниже действия.

1. Создайте в форме новую кнопку сразу под кнопкой Read XML, перетаскивая ее из панели инструментов. 

2. В окне свойств Properties укажите значение btnWriteXML для свойства (Name) и значение Write XML для свойства Text этой кнопки.

3. Затем в определении класса формы frmXML введите код из листинга 10.3.

Листинг 10.3. Код сохранения содержимого объекта DataSet в виде XML-файла

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")
End Sub

В этой подпрограмме создаются два объекта — адаптера данных (daAuthors и daPublishers), которые затем используются для вставки данных в объект dsPubs из двух таблиц базы данных pubs СУБД SQL Server. В листинге 10.4 приведено содержимое файла StoreSales.xml, который создается в результате выполнения этой подпрограммы. Обратите внимание на то, что данный XML-документ содержит записи о продажах, а затем записи о магазинах. Этот подход имеет смысл, так как между ними не задано никакого отношения. Если бы таблицы Sales и Stores были связаны, то эти записи можно было вложить друг в друга. Пример такого вложения приводится далее, в бизнес-ситуации 10.1.

ЛИСТИНГ 10.4. Содержимое файла StoreSales.xml

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
 <Sales>
  <stor_id>6380</stor_id>
  <ord_num>6871</ord_num>
  <ord_date>l994-09-14T00:00:00.0000000+02:00</ord_date>
  <qty>5</qty>
  <payterms>Net 60</payterms>
  <title_id>BU1032</title_id>
 </Sales>
 <Sales>
  <stor_id>6380</stor_id>
  <ord_num>722a</ord_num>
  <ord_date>l994-09-13T00:00:00.0000000+02:00</ord_date>
  <qty>3</qty>
  <payterms>Net 60</payterms>
  <title_id>PS2091</title_id>
 </Sales>
 <Sales>
  <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>
  <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>PS209K/title_id>
 </Sales>
 <Sales>
  <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>
  <stor_id>7067</stor_id>
  <ord_nurn>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>
  <stor_id>7067</stor_id>
  <оrd_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>
  <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>
  <stor_id>7131</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>
  <stor_id>7131</stor_id>
  <оrd_num>N914014</оrd_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>
  <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>
  <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>
  <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>
  <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>
  <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>
  <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>
  <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>
  <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>
  <stor_id>8042</stor_id>
  <ord_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>
  <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>
  <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>
  <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>
  <stor_id>7066</stor_id>
  <stor_name>Barnum's</stor_name>
  <stor_address>567 Pasadena Ave.</stor_address>
  <state>CA</state>
  <zip>92789</zip>
 </Stores>
 <Stores>
  <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>
  <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>
  <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>
  <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>
</NewDataSet>

В приведенном примере демонстрируется простейший способ записи данных из объекта DataSet в XML-файл. Помимо этого способа существуют другие варианты записи данных и схемы с помощью перегруженных версий метода WriteXML. Соответствующие им перегруженные версии метода ReadXML содержат второй параметр со значением XmlWriteMode. В табл. 10.2 приведено краткое описание членов перечисления XmlWriteMode.

Таблица 10.2. Перечисление XmlWriteMode 

Имя члена перечисления Описание
DiffGram Записывает данные из объекта DataSet в виде объекта DiffGram с текущими исходными значениями всех записей
WriteSchema Записывает данные из объекта DataSet в XML-формате вместе с их схемой. Если объект DataSet содержит только схему, то записывается только схема. Если в объекте DataSet не определена схема, то ничего не записывается
IgnoreSchema Этот режим используется по умолчанию для записи содержимого объекта DataSet в XML-формате без схемы  

НА ЗАМЕТКУ

Объект DataSet имеет методGetXml, который возвращает XML-строку с данными из объекта DataSet. Точно такой же результат можно получить, используя метод со вторым параметром XmlWriteMode, который имеет значение IgnoreSchema. Извлечение данных в виде одной строки иногда позволяет более гибко программировать доступ к данным, но требует больших усилий, особенно если вам нужно всего лишь записать данные в файл. 

Для записи схемы данных из объекта DataSet в отдельном XSD-файле (вместо встраивания ее в данные) предусмотрен метод WriteXmlSchema, который используется так, как показано ниже.

dsSales.WriteXmlSchema

В листинге 10.5 приведено содержимое файла StoreSales.xsd, полученного в результате выполнения этого метода.

Листинг 10.5. Содержимое файла StoreSales.xsd, который является схемой из объекта dsSales

<?xml version="1.0" standalone="yes"?>
<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
 <xs:element name="NewDataSet" msdata:lsDataSet="true">
  <xs:complexType>
   <xs:choice maxOccurs="unbounded">
    <xs:element name="Sales">
     <xs:complexType>
      <xs:sequence>
       <xs:element name="stor_id" type="xs:string" minOccurs="0" />
       <xs:element name="ord_num" type="xs:string" minOccurs="0" />
       <xs:element name="ord_date" type="xs:dateTime" minOccurs="0" />
       <xs:element name="qty" type="xs:short" minOccurs="0" />
       <xs:element name="payterms" type="xs:string" minOccurs="0" />
       <xs:element name="title_id" type="xs:string" minOccurs="0" />
      </xs:sequence>
     </xs:complexType>
    </xs:element>
    <xs:element name="Stores">
     <xs:complexType>
      <xs:sequence>
       <xs:element name="stor_id" type="xs:string" minOccurs="0" />
       <xs:element name="stor_name" type="xs:string" minOccurs="0" />
       <xs:element name="stor_address" type="xs:string" minOccurs="0" />
       <xs:element name="city" type="xs:string" minOccurs="0" />
       <xs:element name="state" type="xs:string" minOccurs="0" />
       <xs:element name="zip" type="xs:string" minOccurs="0" />
      </xs:sequence>
     </xs:complexType>
    </xs:element>
   </xs:choice>
  </xs:complexType>
 </xs:element>
</xs:schema>

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


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