//выбрать все строки из таблицы 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):
1
Chai
1
1
10 boxes x 20 bags
18
39
0
10
false
2
Chang
1
1
24 - 12 oz bottles
19
17
40
25
false
1
Exotiс Liquids
Charlotte Cooper
Purchasing Manager
49 Gilbert St.
London
EC1 4SD
UK
(171) 555-2222
2
New Orleans Cajun Delights
Shelley Burke
Order Adminisirator
P.O. Box 78934
New Orleans
LA
70117
USA
(100) 555-4822
#CAJUN.HTM#
Эта схема включает в себя обе таблицы данных DataTables, которые находились в DataSet. Данные также содержат все данные из обеих таблиц. Несколько продуктов и поставщиков были удалены из окончательного файла, чтобы сэкономить пространство. Как и раньше, можно сохранить только схему или только данные, передавая соответствующий параметр XmlWriteMode.
Преобразование документа XML в данные ADO.NET
Предположим что имеется документ XML, который нужно поместить в DataSetADO.NET. И вы хотите сделать это так. чтобы можно было загрузить XML в базу данных, или, может быть, связать данные с управляющим элементом данных .NET, таким как DataGrid. Таким образом, можно будет на самом деле использовать документ XML в качестве хранилища данных, и можно будет полностью исключить накладные расходы, связанные с базой данных. Вот некоторый код для начала ( ADOSample4):
private void button1_Click(object sender, System.EventArgs e) {
// создать новое множество данных (DataSet)
DataSet ds=new DataSet("XMLProducts");
//считать документ Xml в Dataset
ds.ReadXml("..\\..\\..\\prod.xml");
//загрузить данные в таблицу
detaGrid1.DataSource=ds;
dataGrid1.DataMember="products";
//создать новый XmlDataDocument
doc=new XmlDataDocument(ds);
//загрузить имена продуктов в окно списка
XmlNodeList nodeLst=doc.SelectNodes("//ProductName");
foreach(XmlNode nd in nodeLst) listBox1.Items.Add(nd.InnerXml);
}
Действительно, просто. Создается экземпляр нового объекта DataSet. Вызывается метод ReadXml, и XML оказывается в DataTableв DataSet. Как и методы WriteXml, ReadXmlимеет параметр XmlReadModeи пару дополнительных опций в XmlReadMode. Они приводятся в следующей таблице:
| Имя перечисления |
Описание |
Auto |
Задает для XmlReadModeнаиболее подходящее значение. Если данные находятся в формате DiffGram, выбирается DiffGram. Если схема уже была прочитана, или если обнаружена подставляемая схема, то выбирается ReadSchema. Если с DataSet не связано ни одной схемы и не обнаружена подставляемая схема, то выбирается IgnoreSchema. |
DiffGram |
Считывает в документ DiffGramи применяет изменения к DataSet. DiffGramописан далее в этой главе. |
Fragment |
Считывает документы, которые содержат фрагменты схемы XDR, такие как тип, созданный SQL Server. |
IgnoreSchema |
Игнорирует подставляемую схему, которая может быть обнаружена. Считывает данные в текущую схему DataSet. Если данные не соответствуют схеме DataSet, они отбрасываются. |
InferSchema |
Игнорирует любую подставляемую схему. Создает схему на основе данных в документе XML. Если она существует в DataSet, используется эта схема, расширяемая дополнительными столбцами и таблицами. Если столбец существует, но имеет другой тип данных, порождается исключение. |
ReadSchema |
Считывает подставляемую схему и загружает данные. Не будет перезаписывать схему в DataSet, но будет порождать исключение, если таблица в подставляемой схеме уже существует в DataSet. |
Существует также метод ReadSchema. Он будет считывать автономную схему и создавать таблицы, столбцы и отношения соответственно. Этот метод используется, если схема не поставляется вместе с данными. ReadSchemaимеет те же четыре перегружаемые версии, строку с именем файла и путем доступа, объект на основе Stream, объектна основе TextReaderи объект на основе XmlReader.
Читать дальше