Отметим добавление двух циклов 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>