Ватсон Карли
Шрифт:
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
. Чтобы показать, что таблицы данных будут созданы правильно, загрузим документ XML, который содержит таблицы
Products
и Suppliers
, использовавшиеся в предыдущем примере. В этот раз, однако, загрузим в listbox
имена DataTable
, имена DataColumn
и тип данных. Мы можем сравнить это с первоначальной базой данных Northwind
, чтобы убедиться, что все по-прежнему хорошо. Вот код, который будет применяться и который можно найти в ADOSample5
: private void button1_Click(object sender, System.EventArgs e) {
// создать DataSet
DataSet ds=new DataSet("XMLProducts");
// считать документ xml
ds.ReadXml("..\\..\\..\\SuppProd.xml");
// загрузить данные в сетку
dataGrid1.DataSource=ds;
dataGrid1.DataMember="products";
// загрузить в listbox информацию о таблицах, столбцах и типах данных
foreach(DataTable dt in ds.Tables) {
listBox1.Items.Add(dt.TableName);
foreach(DataColumn col in dt.Columns) {
listBox1.Items.Add('\t' + col.ColumnName + " - " + col.DataType.FullName);
}
}
}
Отметим добавление двух циклов
foreach
(выделенных полужирным шрифтом). Первый цикл извлекает имя таблицы из каждой таблицы в коллекции таблиц DataSet
. Внутри цикла foreach
извлекаются имя и тип данных каждого столбца в DataTable
. Эти данные загружаются в listbox
, чтобы их можно было вывести. Вот что мы должны увидеть на экране: Посмотрев на
listbox
, можно увидеть, что DataTables
были созданы с помощью столбцов, которые имеют правильные имена и типы данных. Кроме того, можно заметить, что последние два примера не преобразуют никаких данных в или из базы данных, таким образом, не определены
SqlDataAdapters
или SqlConnections
. Это дает начальное представление о реальной гибкости пространства имен System.Xml
и ADO.NET. Можно посмотреть на одни и те же данные в множестве форматов. Если понадобиться сделать преобразование и показать данные в формате HTML или необходимо связать их с сеткой, возьмите те же самые данные и с помощью вызова метода получите их в нужном формате. Запись и чтение DiffGram
DiffGram
является документом XML, который содержит данные до и после сеанса редактирования, включающего любую комбинацию изменений данных, добавлений и удалений. DiffGram
может использоваться как аудиторский журнал или для процесса подтверждения/отката. Большинство систем DBMS сегодня имеют такое встроенное средство. Но если придется работать с DBMS, которая не имеет таких свойств или если хранилищем данных является XML и отсутствует DBMS, то можно будет самостоятельно реализовать свойства подтверждения/отката. Далее представлен код, показывающий, как
DiffGram
создается и как DataSet
можно создать из DiffGram:pwd
(он находится в папке ADOSample6
). Начальная часть этого кода должна быть уже знакома. Мы определяем и задаем новый объект DataSet
, ds
, новый объект SqlConnection
, conn
и новый объект SqlDataAdapter
, da
. Мы соединяемся с базой данных, выбираем все строки из таблицы Products
, создаем новый объект DataTable
с именем products
и загружаем данные из базы данных в DataSet
: