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 сегодня имеют такое встроенное средство.
Далее представлен код, показывающий, как
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
рейтинг книги
Сердце Дракона. Предпоследний том. Часть 1
Сердце дракона
Фантастика:
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 8
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Под маской, или Страшилка в академии магии
Фантастика:
юмористическая фантастика
7.78
рейтинг книги
Мой любимый (не) медведь
Любовные романы:
современные любовные романы
7.90
рейтинг книги
Академия
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Играть, чтобы жить. Книга 3. Долг
3. Играть, чтобы жить
Фантастика:
фэнтези
киберпанк
рпг
9.36
рейтинг книги
Виконт. Книга 4. Колонист
Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.50
рейтинг книги
Вечный Данж. Трилогия
Фантастика:
фэнтези
юмористическая фантастика
6.77
рейтинг книги
Мужчина не моей мечты
1. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.30
рейтинг книги
Последний Паладин. Том 7
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Истинная со скидкой для дракона
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Волк 7: Лихие 90-е
7. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кровь Василиска
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25