<xsd:element name='XMLProducts' msdata:IsDataSet='true'>
<xsd:complexType>
<xsd:choice maxOccurs='unbounded'>
<xsd:element name='products'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='ProductID' type='xsd:int' minOccurs='0' />
<xsd:element name='ProductName' type='xsd:string' minOccurs='0' />
<xsd:element name='SupplierID' type='xsd:int' minOccurs ='0' />
<xsd:element name='CategoryID' type='xsd:int' minOccurs='0' />
<xsd:element name='QuantityPerUnit' type='xsd:string' minOccurs='0' />
<xsd:element name='UnitPrice' type='xsd:decimal' minOccurs='0' />
<xsd:element name='UnitsInStock' type='xsd:short' minOccurs='0' />
<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'>