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

на главную

Жанры

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

Ватсон Карли

Шрифт:

Существует также метод

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
:

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

 // новый объект DataSet

 DataSet ds=new DataSet("XMLProducts");

 // Сделать соединение и загрузить строки продуктов

 SqlConnection conn=

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

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

 // заполнить DataSet

 da.Fill(ds, "products");

 // редактируем первую строку

 ds.Tables["products"].Rows[0]["ProductName"] = "NewProdName";

В следующем разделе мы сделаем следующие преобразования. Во-первых, изменим столбец

ProductName
в первой строке на
NewProdName
. Во-вторых, создадим новую строку в
DataTable
, задавая значения столбцов и добавляя в конце новую строку данных в
DataTable
.

 // добавить новую строку

 DataRow dr=ds.Tables["products"].NewRow;

 dr["ProductId"]=100;

 dr["CategoryId"]=2;

 dr["Discontinued"]=false;

 dr["ProductName"]="This is the new product";

 dr["QuantityPerUnit"]=12;

 dr["ReorderLevel"]=1;

 dr["SupplierId"]=12;

 dr["UnitPrice"]=23;

 dr["UnitsInStock"]=5;

 dr["UnitsOnOrder"]=0;

 Tables["products"].Rows.Add(dr);

Это интересная часть кода. Прежде всего записывается схема с помощью

WriteXmlSchema
. Это важно, так как нельзя будет заново считать в
DiffGram
без схемы.
WriteXml
с переданным в него параметром
XmlWriteMode.DiffGram
создает в действительности
DiffGram
. Следующая строка принимает сделанные изменения. Важно то, что
DiffGram
создается до вызова
AcceptChanges
, иначе не будет никакого различия между состоянием до того и после.

Поделиться:
Популярные книги

Энфис 6

Кронос Александр
6. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 6

Сердце Дракона. Предпоследний том. Часть 1

Клеванский Кирилл Сергеевич
Сердце дракона
Фантастика:
фэнтези
5.00
рейтинг книги
Сердце Дракона. Предпоследний том. Часть 1

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Под маской, или Страшилка в академии магии

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.78
рейтинг книги
Под маской, или Страшилка в академии магии

Мой любимый (не) медведь

Юнина Наталья
Любовные романы:
современные любовные романы
7.90
рейтинг книги
Мой любимый (не) медведь

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Играть, чтобы жить. Книга 3. Долг

Рус Дмитрий
3. Играть, чтобы жить
Фантастика:
фэнтези
киберпанк
рпг
9.36
рейтинг книги
Играть, чтобы жить. Книга 3. Долг

Виконт. Книга 4. Колонист

Юллем Евгений
Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.50
рейтинг книги
Виконт. Книга 4. Колонист

Вечный Данж. Трилогия

Матисов Павел
Фантастика:
фэнтези
юмористическая фантастика
6.77
рейтинг книги
Вечный Данж. Трилогия

Мужчина не моей мечты

Ардова Алиса
1. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.30
рейтинг книги
Мужчина не моей мечты

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Истинная со скидкой для дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Истинная со скидкой для дракона

Волк 7: Лихие 90-е

Киров Никита
7. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 7: Лихие 90-е

Кровь Василиска

Тайниковский
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Кровь Василиска