Thao tác XML XML và ADO.NET – Phần 3 Đọc và ghi một DiffGram Một DiffGram là một tài liệu XML chứa dữ liệu trước và sau một đợt soạn thảo. Nó có thể bao gồm các thay đổi dữ liệu, thêm và xoá. Một DiffGram có thể được sử dụng như một sổ theo dõi để cho phép và phục hồi xử lí. DBMS được nhiều người sử dụng, nhưng DBMS không có các đặc tính này, nếu bạn sử dụng DBMS thì bạn phải tự thực hiện các thao tác này. Mã dưới đây chỉ ra cách một DiffGram được tạo và một DataSet có thể được tạo từ một DiffGram (mã có thể được tìm thấy trong thư mục ADOSample6). Phần bắt đầu của mã trong rất quen thuộc. Chúng ta định nghĩa một DataSet mới, ds, một SqlConnection mới, conn, và một SqlDataAdapter mới, da. Chúng ta kết nối cơ sở dữ liệu, chọn tất cả các dòng từ bảng Products, tạo một DataTable mới đặt tên là products, và load dữ liệu từ cơ sở dữ liệu vào DataSet: private void button1_Click(object sender, System.EventArgs e) { //new DataSet DataSet ds=new DataSet("XMLProducts"); //Make connection and load products rows SqlConnection conn=new SqlConnection (@"server=GLYNNJ_CS\NetSDK;uid=sa;pwd=;database=northwind"); SqlDataAdapter da=new SqlDataAdapter("SELECT * FROM products",conn); //fill the DataSet da.Fill(ds,"products"); //edit first row ds.Tables["products"].Rows[0]["ProductName"]="NewProdName"; Trong không mã tiếp theo chúng ta làm hai việc. Trước tiên, chúng ta sửa đổi cột ProductName trong dòng đầu tiên của NewProdName. Thứ hai, chúng ta tạo một dòng mới trong DataTable, đặt giá trị cho các cột, và cuối cùng là thêm các dòng dữ liệu cho DataTable. //add new row 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; ds.Tables["products"].Rows.Add(dr); Khối tiếp theo là phần thú vị nhất. Trước tiên, chúng ta ghi lại schema với phương thức WriteXmlSchema(). Nó quan trọng bởi vì bạn không thể đọc lại một DiffGram mà không có schema. WriteXml() với tham số XmlWriteMode.DiffGram tạo ra DiffGram. Dòng tiếp theo cho phép các thay đổi được cập nhật. Quan trọng là DiffGram phải được tạo trước khi gọi AcceptChanges(), mặt khác sẽ không có thay đổi trên dữ liệu. //Write the Schema ds.WriteXmlSchema(" \\ \\ \\diffgram.xsd"); //generate the DiffGram ds.WriteXml(" \\ \\ \\diffgram.xml",XmlWriteMode.DiffGram); ds.AcceptChanges(); //load data into grid dataGrid1.DataSource=ds; dataGrid1.DataMember="products"; //new XmlDataDocument doc=new XmlDataDocument(ds); //load the productnames in the list XmlNodeList nodeLst=doc.SelectNodes("//ProductName"); foreach(XmlNode nd in nodeLst) listBox1.Items.Add(nd.InnerXml); } Thứ tự để lấy dữ liệu vào một DataSet như sau: DataSet dsNew=new DataSet(); dsNew.ReadXmlSchema(" \\ \\ \\diffgram.xsd"); dsNew.XmlRead(" \\ \\ \\diffgram.xml",XmlReadMode.DiffGram); Ở đây chúng ta tạo một DataSet, dsNew. Gọi phương thức ReadXmlSchema() tạo một DataTable dựa trên thông tin schema. Trong trường hợp này nó có thể là bảng dữ liệu products. Giờ đây chúng ta có thể đọc trong DiffGram. DiffGram không chứa thông tin schema, DataTable cân được tạo trước khi gọi phương thức ReadXml(). Đây là ví dụ về 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:hasChanges="modified"> <ProductID>1</ProductID> <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> </products> <products diffgr:id="products78" msdata:rowOrder="77" diffgr:hasChanges="inserted"> <ProductID>100</ProductID> <ProductName>This is the new product</ProductName> <SupplierID>12</SupplierID> <CategoryID>2</CategoryID> <QuantityPerUnit>12</QuantityPerUnit> <UnitPrice>23</UnitPrice> <UnitsInStock>5</UnitsInStock> <UnitsOnOrder>0</UnitsOnOrder> <ReorderLevel>1</ReorderLevel> <Discontinued>false</Discontinued> </products> </XMLProducts> <diffgr:before> <products diffgr:id="products1" msdata:rowOrder="0"> <ProductID>1</ProductID> <ProductName>Chai</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> </products> </diffgr:before> </diffgr:diffgram> Sau khi DiffGram được đọc vào DataTable, nó ở trạng thái tạo dữ liệu nhưng trước khi AcceptChanges() được gọi. Tại thời điểm này bạn có thể phục hồi dữ liệu bằng cách gọi phương thức RejectChanges(). Xem xét thuộc tínhh DataRow.Item và truyền cho DataRowVersion.Original và DataRowVersion.Current, bạn có thể thấy giá trị trước và sau trong DataTable. Nếu bạn giữ một một chuỗi DiffGrams thì chúng cho phép bạn phục hồi theo thứ tự. Chắc rằng bạn muốn phục hồi thay đổi nhiều cấp, bạn có thể dùng DiffGrams. . Thao tác XML XML và ADO. NET – Phần 3 Đọc và ghi một DiffGram Một DiffGram là một tài liệu XML chứa dữ liệu trước và sau một đợt soạn thảo. Nó có thể bao gồm các thay đổi dữ liệu, thêm và. ReadXml(). Đây là ví dụ về DiffGram (diffgram .xml) : < ?xml version="1.0" standalone="yes"?> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com :xml- msdata". xmlns:msdata="urn:schemas-microsoft-com :xml- msdata" xmlns:diffgr="urn:schemas-microsoft-com :xml- diffgram-v1"> <XMLProducts> <products diffgr:id="products1"