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>
Показаны
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" />
Поделиться с друзьями: