Отметим добавление двух циклов 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, иначе не будет никакого различия между состоянием до того и после.
// записать схему
ds.WriteXmlSchema('..\..\..\diffgram.xsd');
// создать DiffGram
ds.WriteXml('..\..\..\diffgram.xml', XmlWriteMode.DiffGram);
ds.AcceptChanges();
// загрузить данные в сетку
dataGrid1.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, можно сделать следующее:
DataSet dsNew = new DataSet();
dsNew.ReadXmlSchema('..\..\..\diffgram.xsd');
dsNew.XmlRead('..\..\..\diffgram.xml', XmlReadMode.DiffGram);
В этом примере создается новый объект множества данных DataSet, dsNew. Вызов метода ReadXmlSchema создает новый объект DataTable на основе информации схемы. В данном случае он будет клоном DataTable продуктов. Теперь можно считать в DiffGram. DiffGram не содержит информации о схеме, поэтому важно, чтобы объект DataTable был создан и готов к использованию до вызова метода ReadXml. Вот образец того, как выглядит DiffGram (diffgram.xml):
<?xml version='1.0' standalone='yes'?>
<diffgr:diffgram xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1'>
<XMLProducts>
<products diffgr:id='products1' msdata:rowOrder='0' diffgr:hasChanged='modified'>
<ProductID>1</ProduсtID>
