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
, иначе не будет никакого различия между состоянием до того и после.
Поделиться:
Популярные книги
Крепость над бездной
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Новик
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Мир-о-творец
8. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 10
10. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Третий. Том 3
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 2
2. Эволюционер из трущоб
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Начальник милиции 2
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Зеркало силы
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кротовский, сколько можно?
5. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Машенька и опер Медведев
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Убивать чтобы жить 7
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
1941: Время кровавых псов
1. Всеволод Залесский
Приключения:
исторические приключения
6.36
рейтинг книги
Архил...? 4
4. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
5.50