intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

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

Chia sẻ: Nguyen Uyen | Ngày: | Loại File: PDF | Số trang:17

78
lượt xem
20
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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.

Chủ đề:
Lưu

Nội dung Text: Thao tác XML - XML và ADO.NET – Phần 2

  1. 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
  2. //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"]);
  3. //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:
  4. 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):
  5. 1 Chai
  6. 1 1 10 boxes x 20 bags 18 39 0 10 false 1 Exotic Liquids Charlotte Cooper Purchasing Manager
  7. 49 Gilbert St. London EC1 4SD UK (171) 555-2222 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ừ
  8. 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
  9. 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 X mlReadMode. Bảng sau đây mô tả chúng: Giá trị Giải thích Gán vào XmlReadMode giá trị thích hợp nhất. Auto 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
  10. 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. Đọc trong DiffGram và áp dụng các thay đổi cho DataSet. DiffGram DiffGrams được mô tả trong phần sau. Đọc tài liệu chứa sơ đồ XDR phân mảnh, như kiểu được Fragment tạo bởi SQL Server. Bỏ qua các schema nội. Đọc dữ liệu trong sơ đồ DataSet IgnoreSchema hiện tại. Nếu dữ liệu không tìm thấy trong DataSet schema nó được bỏ qua. Bỏ qua schema nội. Tạo schema dựa trên tài liệu XML. InferSchema Nếu một schema có sẵn trong DataSet, schema này được
  11. 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. Đọc schema nội và load dữ liệu. Sẽ không ghi đè một ReadSchema 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
  12. 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);
  13. } } } 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.
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2