Tải bản đầy đủ (.pdf) (17 trang)

Thao tác XML - XML và ADO.NET – Phần 2 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (117.2 KB, 17 trang )

Thao tác XML
XML và ADO.NET – Phần 2

Chuyển sang cơ sở dữ liệu quan hệ
Các ví dụ trên chỉ thực hiện cho một bảng, nhưng với cơ sở dữ liệu quan hệ
thì sao chẳng hạn như multiple DataTables và Relations trong DataSet?
Chúng vẫn hoạt động bình thường. Hãy thực hiện các thay đổi sau trong mã
nguồn mã chúng ta đã dùng (mã nguồn có thể tìm thấy trong ADOSample3):
private void button1_Click(object sender, System.EventArgs e)
{
//create a dataset
DataSet ds=new DataSet("XMLProducts");
//connect to the northwind database and
//select all of the rows from products table and from suppliers table
//make sure your connect string matches your server configuration
SqlConnection conn=new SqlConnection

(@"server=GLYNNJ_CS\NetSDK;uid=sa;pwd=;database=northwind");
SqlDataAdapter daProd=new SqlDataAdapter("SELECT * FROM
products",conn);
SqlDataAdapter daSup=new SqlDataAdapter("SELECT * FROM
suppliers",conn);
//Fill DataSet from both SqlAdapters
daProd.Fill(ds,"products");
daSup.Fill(ds,"suppliers");
//Add the relation
ds.Relations.Add(ds.Tables["suppliers"].Columns["SupplierId"],
ds.Tables["products"].Columns["SupplierId"]);
//Write the XML to a file so we can look at it later
ds.WriteXml(" \\ \\ \\SuppProd.xml",XmlWriteMode.WriteSchema);
//load data into grid


dataGrid1.DataSource=ds;
dataGrid1.DataMember="suppliers";
//create the XmlDataDocument
doc=new XmlDataDocument(ds);
//Select the productname elements and load them in the grid
XmlNodeList nodeLst=doc.SelectNodes("//ProductName");
foreach(XmlNode nd in nodeLst)
listBox1.Items.Add(nd.InnerXml);
}
Trong ví dụ này chúng ta tạo hai DataTables trong DataSet XMLProducts:
Products và Suppliers. Quan hệ là Suppliers cung cấp Products. Chúng ta tạo
mọt quan hệ trên cột SupplierId ở cả hai bảng. Bảng DataSet trông như sau:

Bằng cách tạo phương thức WriteXml() giống như ta đã làm ở ví dụ trước,
chúng ta sẽ nhận được file XML như sau (SuppProd.xml):
<?xml version="1.0" standalone="yes"?>
<XMLProducts>
<xs:schema id="XMLProducts" xmlns=""
xmlns:xs="
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="XMLProducts" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="products">
<xs:complexType>
<xs:sequence>
<xs:element name="ProductID" type="xs:int"
minOccurs="0" />
<xs:element name="ProductName" type="xs:string"
minOccurs="0" />

<xs:element name="SupplierID" type="xs:int"
minOccurs="0" />
<xs:element name="CategoryID" type="xs:int"
minOccurs="0" />
<xs:element name="QuantityPerUnit" type="xs:string"
minOccurs="0" />
<xs:element name="UnitPrice" type="xs:decimal"
minOccurs="0" />
<xs:element name="UnitsInStock" type="xs:short"
minOccurs="0" />
<xs:element name="UnitsOnOrder" type="xs:short"
minOccurs="0" />
<xs:element name="ReorderLevel" type="xs:short"
minOccurs="0" />
<xs:element name="Discontinued" type="xs:boolean"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="suppliers">
<xs:complexType>
<xs:sequence>
<xs:element name="SupplierID" type="xs:int"
minOccurs="0" />
<xs:element name="CompanyName" type="xs:string"
minOccurs="0" />
<xs:element name="ContactName" type="xs:string"
minOccurs="0" />
<xs:element name="ContactTitle" type="xs:string"
minOccurs="0" />

<xs:element name="Address" type="xs:string"
minOccurs="0" />
<xs:element name="City" type="xs:string"
minOccurs="0" />
<xs:element name="Region" type="xs:string"
minOccurs="0" />
<xs:element name="PostalCode" type="xs:string"
minOccurs="0" />
<xs:element name="Country" type="xs:string"
minOccurs="0" />
<xs:element name="Phone" type="xs:string"
minOccurs="0" />
<xs:element name="Fax" type="xs:string"
minOccurs="0" />
<xs:element name="HomePage" type="xs:string"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:unique name="Constraint1">
<xs:selector xpath=".//suppliers" />
<xs:field xpath="SupplierID" />
</xs:unique>
<xs:keyref name="Relation1" refer="Constraint1">
<xs:selector xpath=".//products" />
<xs:field xpath="SupplierID" />
</xs:keyref>
</xs:element>

</xs:schema>
<products>
<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>
<suppliers>
<SupplierID>1</SupplierID>
<CompanyName>Exotic Liquids</CompanyName>
<ContactName>Charlotte Cooper</ContactName>
<ContactTitle>Purchasing Manager</ContactTitle>
<Address>49 Gilbert St.</Address>
<City>London</City>
<PostalCode>EC1 4SD</PostalCode>
<Country>UK</Country>
<Phone>(171) 555-2222</Phone>
</suppliers>
</XMLProducts>
Sơ đồ bao gồm cả hai DataTables trong DataSet. Hơn nữa, dữ liệu bao gồm
tất cả dữ liệu trong cả hai bảng. Vì lí do ngắn gọn , chúng ta chỉ chỉ ra nhà
cung cấp và các sản phẩm đầu tiên. Giống như trước bạn có thể chỉ lưu
schema hoặc dữ liệu thông qua tham số XmlWriteMode.
Chuyển đổi XML thành dữ liệu ADO.NET

Nếu bạn có một tài liệu XML và muốn chuyển nó thành một ADO.NET
DataSet. Để làm điều này bạn load XML vào một, hoặc có thể kết nối dữ
liệu với một điều khiển dữ liệu .NET như DataGrid. Cách này bạn có thể
thật sự sử dụng tài liệu XML như một kho lưu trữ dữ liệu, và có thể loại trừ
khả năng truy xuất ra ngoài cơ sở dữ liệu. Nếu dữ liệu của bạn vừa phải, thì
có thể áp dụng cách này. Mã nằm trong ADOSample4:
private void button1_Click(object sender, System.EventArgs e)
{
//create a new DataSet
DataSet ds=new DataSet("XMLProducts");
//read in the XML document to the Dataset
ds.ReadXml(" \\ \\ \\prod.xml");
//load data into grid
dataGrid1.DataSource=ds;
dataGrid1.DataMember="products";
//create the new XmlDataDocument
doc=new XmlDataDocument(ds);
//load the product names into the listbox
XmlNodeList nodeLst=doc.SelectNodes("//ProductName");
foreach(XmlNode nd in nodeLst)
listBox1.Items.Add(nd.InnerXml);
}
Chúng ta khởi tạo một đối tượng DataSet. Sau đó gọi phương thức
ReadXml(), và giờ đây bạn có XML trong một DataTable trong DataSet của
bạn. Các phương thức WriteXml(), ReadXml() có một tham số
XmlReadMode. ReadXml() có một cặp tùy chọn trong XmlReadMode.
Bảng sau đây mô tả chúng:
Giá trị Giải thích
Auto Gán vào XmlReadMode giá trị thích hợp nhất.
Nếu dữ liệu được định dạng là DiffGram, DiffGram đư

ợc
chọn.
Nếu schema sẵn sàng để đọc, hoặc một schema nội đư
ợc
Giá trị Giải thích
tìm ra, thì ReadSchema được chọn.
Nếu không có schema nào được gán trong DataSet
, và
không một nội tuyến nào được tìm ra, thì IgnoreSchema

được chọn.
DiffGram Đọc trong DiffGram và áp dụng các thay đổi cho DataSet
.
DiffGrams được mô tả trong phần sau.
Fragment Đọc tài liệu chứa sơ đồ XDR phân mảnh, như kiểu đư
ợc
tạo bởi SQL Server.
IgnoreSchema Bỏ qua các schema nội. Đọc dữ liệu trong sơ đồ DataSet

hiện tại. Nếu dữ liệu không tìm thấy trong DataSet

schema nó được bỏ qua.
InferSchema Bỏ qua schema nội. Tạo schema dựa trên tài liệu X
ML.
Nếu một schema có sẵn trong DataSet, schema này đư
ợc
Giá trị Giải thích
sử dụng, và được mở rộng và thêm vào các cột
và các
b

ảng nếu cần. Có thể xảy ra một ngoại lện nếu một cột
tồn tại sẵn, nhưng khác kiểu dữ liệu.
ReadSchema Đọc schema nội và load dữ liệu. Sẽ không ghi đè m
ột
schema trong DataSet, Nhưng s
ẽ tạo ra một ngoại lện nếu
bảng trong schema nội đã có sẵn trong DataSet.
Phương thức ReadXmlSchema() sẽ đọc trong một schema độc lập và tạo các
bảng, cột và các quan hệ. Bạn sẽ dụng nó nếu schema của bạn không nội
tuyến với dữ liệu. ReadXmlSchema() có bốn quá tải: chuỗi với tên và đường
dẫn của file, đối tượng xuất phát Stream, đối tượng xuất phát từ TextReader
và một đối tượng xuất phát từ XmlReader.
private void button1_Click(object sender, System.EventArgs e)
{
//create the DataSet
DataSet ds=new DataSet("XMLProducts");
//read in the XML document
ds.ReadXml(" \\ \\ \\SuppProd.xml");
//load data into grid
dataGrid1.DataSource=ds;
dataGrid1.DataMember="products";
//load the listbox with table, column and datatype info
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);
}

}
}
Chú ý rằng ở đây dùng hai vòng lặp foreach. Vòng lặp thứ nhất dùng để lấy
tên của mỗi bảng trong tập hợp the Tables của DataSet. Vòng lặp foreach
thứ hai dùng để lấy dữ liệu cho mỗi cột trong DataTable. Chúng ta load dữ
liệu này vào listbox, để cho phép hiển thị chúng. Đây là màn hình sau khi
chạy:
Bạn nên nhớ rằng cả hai ví dụ trên đều không truyên bất kì giữ liệu nào từ
hoặc đến một cơ sở dữ liệu, không có một SqlDataAdapter hoặc
SqlConnection nào được định nghĩa. Nó chỉ ra tính mềm dẻo của hai không
gian tên System.Xml và ADO.NET: bạn có thể xem xet dữ liệu trong nhiều
định dạng. Nếu bạn muốn truyền dữ liệu theo định dạng HTML, hoặc nếu
muốn kết nối với một grid, bạn cần có dữ liệu tương tự, và gọi phương thức
thích hợp.

×