Чтение онлайн

ЖАНРЫ

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

<xsd:element name="UnitsOnOrder" type="xsd:short" minOccurs="0" />

<xsd:element name="ReorderLevel" type="xsd:short" minOccurs="0" />

<xsd:element name="Discontinued" type="xsd:boolean" minOccurs="0" />

</xsd:sequence>

</xsd:сomplexType>

</xsd:element>

</xsd:choice>

</xsd:complexType>

</xsd:element>

 </xsd:schema>

 <products>

<ProductID>1</ProductID>

<ProductName>Chai</ProductName>

<SupplierID>1</SupplierID>

<CategoryID>1</CategoryID>

<QuantityPerUnit>10 boxes x 20 bags</QuantityPerUnit>

<UnitPrice>18</UnitPrice>

<UnitsInStock>39</UnitsInStock>

<UnitsOnOrder>0</UnitsOnOrder>

<ReorderLevel>10</ReorderLevel>

<Discontinued>false</Discontinued>

 </products>

 <products>

<ProductID>2</ProductID>

<ProductName>Chang</ProductName>

<SupplierID>1</SupplierID>

<CategoryID>1</CategoryID>

<QuantityPerUnit>24 - 12 oz bottles</QuantityPerUnit>

<Unitprice>19</UnitPrice>

<UnitsInStock>17</UnitsInStock>

<UnitsOnOrder>40</UnitsOnOrder>

<ReorderLevel>25</ReorderLevel>

<Discontinued>false</Discontinued>

 </products>

</XMLProducts>

Показаны

только два первых продукта. Реальный файл XML будет содержать все продукты из таблицы
Products
базы данных
Northwind
.

Это выглядит достаточно просто для одной таблицы, но что будет для реляционных данных, таких как несколько

DataTables
и
Relations
в
DataSet
? Все по-прежнему работает таким же образом. Внесем следующие изменения в коде (эту версию можно найти в
ADOSample3
):

private void button1_Click(object sender, System.EventArgs e) {

 //создать множество данных (DataSet)

 DataSet ds=new DataSet("XMLProducts");

 // соединиться с базой данных northwind и

 //выбрать все строки из таблицы products и таблицы suppliers

 //проверьте, что строка соединения соответствует конфигурации сервера

 SqlConnection conn=

new SqlConnection(@"server=GLYNNJ_CS\NetSDK;uid=sa;pwd=;database=northwind");

 SqlDataAdapter daProd=new SqlDataAdapter("select * from products", conn);

 SqlDataAdapter daSup=new SqlDataAdapter("select * from suppliers", conn);

 //Заполнить DataSet
из обоих SqlAdapters

 daProd.Fill(ds, "products");

 daSup.Fill(ds, "suppliers");

 //Добавить отношение

 ds.Relations.Add(ds.Tables["suppliers"].Columns["SupplierId"],

ds.Tables["products"].Columns["SupplierId"]);

 //Записать Xml в файл, чтобы можно было просмотреть его позже

 ds.WriteXml("..\\..\\..\\SuppProd.xml", XmlWriteMode.WriteSchema);

 //загрузить данные в таблицу

 dataGrid1.DataSource=ds;

 dataGrid1.DataMember="suppliers";

 //создать XmlDataDocument

 doc=new XmlDataDocument(ds);

 //Выбрать элементы productname и загрузить их в таблицу

 XmlNodeList nodeLst=doc.SelectNodes("//ProductName");

 foreach(XmlNode nd in nodeLst) listBox1.Items.Add(nd.InnerXml);

}

В этом примере создаются два объекта

DataTables
в
DataSet
из
XMLProducts
:
Products
и
Suppliers
. Отношение состоит в том, что
Suppliers
(Поставщики) поставляют
Products
(Продукты). Мы создаем новое отношение на столбце
SupplierId
в обоих таблицах. Вот как выглядит
DataSet
:

Делая такой же вызов метода

WriteXml
, как в предыдущем примере, мы получим следующий файл XML (
SuppProd.xml
):

<?xml version="1.0" standalone="yes"?>

<XMLProducts>

 <xsd:schema id="XMLProducts" targetNamespace="" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

<xsd:element name="XMLProducts" msdata:IsDataSet="true">

<xsd:complexType>

<xsd:choice maxOccurs="unbounded">

<xsd:element name="products">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="Product ID" type="xsd:int" minOccurs="0" />

<xsd:element name="ProductName" type="xsd:string" minOccurs="0" />

<xsd:element name="SupplierID" type="xsd:int" minOccurs="0" />

Поделиться с друзьями: