Ватсон Карли
Шрифт:
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>
<ProductName>NewProdName</ProductName>
<SupplierID>1</SupplierID>
<CategoryID>1</CategoryID>
<QuantityPerUnit>10 boxes x 20 bags</QuantityPerUnit>
<UnitPrice>18</UnitPrice>
<UnitsInStock>39</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>10</ReorderLevel>
<Discontinued>false</Discontinued>