*Bài 4: XML * Bài 3: ADO.NET * Bài 2: Các ASP.NET Server Control*

25 thg 7, 2013

Bài 4: XML

1. TỔNG QUAN VỀ XML
1.1. GIỚI THIỆU XML

- XML (Extensible Markup Language) – một loại cơ sở dữ liệu dạng cây, được xây dựng bằng các tag giống HTML

- Là một thành phần quan trọng trong các tiến trình trao đổi dữ liệu

- Có thể xem xét một nguồn XML từ nhiều khía cạnh:

+ Một file text;

+ Một cấu trúc cây (tree);

+ Một tập các bảng dữ liệu.

1.2. TẠO XML DOCUMENT TRÊN VS.NET

- Chọn thư mục trên cửa sổ Solution Explorer

- Chọn Add New Item… từ menu Project

- Chọn Data trên cây Categories

- Chọn XML File trên danh mục Templates

- Nhập tên XML Document vào ô Name

- Nhấn Add



1.3. XML FILE

XMLFile1.xml



1.4. ĐỌC MỘT FILE XML

Sử dụng class XmlTextReader để đọc một file xml



Đoạn code này cho một bảng với các giá trị ở trang sau





Đọc Attribute của một Element

Đoạn code này cho res bằng “Type = TV”

1.5. GHI MỘT FILE XML


Sử dụng class XmlTextWriter


Hàm WriteSanPham



 Kết quả của hàm WriteTo


2. XML DOCUMENT
- Là cấu trúc cây của file xml

- Xét file Catalog1.xml


Có thể sử dụng các đối tượng XmlNode để đọc dữ liệu từ XmlDocument


Ví dụ: Đọc giá trị của các node dùng danh sách ChildNodes 


Ví dụ: Đọc giá trị của các node dùng FirstChild và NextSibling


Kết quả sau khi nhấn nút “Button”


3. MÔ HÌNH DATA CỦA XML DOCUMENT
3.1. CLASS XMLDATADOCUMENT

- Được kế thừa từ XmlDocument

- Có thêm thuộc tính DataSet


3.2. XML SCHEMA

- Là lược đồ dữ liệu của Xml Document

- Ví dụ schema của file Catalog1.xml: font-size:12.0pt;font-family:"Tahoma","sans-serif"'> 

- Có thêm thuộc tính DataSet


Ý nghĩa của các tag:


<xs:element name="Catalog">
Tên của DataSet

<xs:element maxOccurs="unbounded" name="SanPham">
DataTable “SanPham”

<xs:element name="SanPhamID" type="xs:unsignedByte" />
DataColumn “SanPhamID” có kiểu là unsignedByte.


3.3. ĐỌC DỮ LIỆU TỪ FILE XML

Có thể đọc dữ liệu từ file .xml vào DataSet của XmlDataDocument theo các bước sau:

- Tạo một reader kiểu FileStream (hoặc XmlTextReader) để đọc dữ liệu từ file .xml

- Gọi hàm ReadXmlSchema để đọc schema của file .xml

- Gọi hàm Load của XmlDataDocument để đọc dữ liệu từ reader

- Đóng reader t;font-family:"Courier New"'>"unbounded" name="SanPham">

DataTable “SanPham”

<xs:element name="SanPhamID" type="xs:unsignedByte" />
DataColumn “SanPhamID” có kiểu là unsignedByte.



3.4. TRUY VẤN DỮ LIỆU

Có thể đọc dữ liệu từ file .xml theo một điều kiện nào đó bằng các đối tượng

XPathDocument XPathNavigator (XPath namespace) theo các bước sau:
- Tạo đối tượng XPathDocument để mở file .xml

- Dùng hàm CreateNavigator của XPathDocument để tạo đối tượng XmlPathNavigator

- Dùng hàm Select của XPathNavigator để tạo ra một đối tượng XPathNodeIterator

+ Tham số của hàm Select là đường dẫn đến các node cần đọc kèm theo các điều kiện;

+ Dùng hàm MoveNext() của XPathNodeIterator để chuyển dần đến từng node. Khi chạy đến cuối danh sách hàm cho giá trị false;

+ Dùng thuộc tính Current của XPathNodeIterator để lấy node hiện tại.

Ví dụ: Đọc các node TenSanPham thuộc Loai=“TV” và cho hiện tên của chúng lên Responce



3.5. MÔ HÌNH CSDL QUAN HỆ

Xét file Catalog2.xml



- Khi tạo schema của file Catalog2.xml, một khóa mới với tên LoaiSP_Id sẽ được sinh ra và được điền vào bảng LoaiSP làm khóa chính (PK) và vào bảng SanPham làm khóa ngoại lai (FK)

- Mô hình thực thể liên kết thể hiện trên DataSet Editor của VS.2008 


4. TƯƠNG TÁC GIỮA XML VÀ DATASE


Ghi một XML Document từ truy vấn Database

- Dùng phương thức WriteXml của DataSet để ghi dữ liệu vào file .xml trên server

- Dùng phương thức WriteXmlSchema của DataSet để ghi schema vào file .xsd trên server

- Ví dụ:


Đọc dữ liệu từ một XML Document vào DataSet:

- Dùng phương thức ReadXml của DataSet để đọc dữ liệu từ file .xml trên server.

- Dùng phương thức ReadXmlSchema của DataSet để đọc schema từ file .xsd trên server.

- Ví dụ:


------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------



16 thg 7, 2013

Bài 3. ADO.NET

1. TỔNG QUAN VỀ ADO.NET
- Giới thiệu;
- Kiến trúc của ADO.NET.


1.1. GIỚI THIỆU

- Tập hợp các class cho phép truy cập đến nhiều nguồn dữ liệu khác nhau, như các cơ sở dữ liệu (CSDL), các file Excel hoặc Xml

- Tiếp đầu tố của các provider: 



1.2. KIẾN TRÚC CỦA ADO.NET


- Đối tượng Connection tạo ra một kết nối với CSDL, chứa tất cả các thông tin cần thiết để mở CSDL

- Đối tượng Command được dùng để chạy một lệnh CSDL thông qua một Connection:

+ ExecuteNonQuery: chạy các lệnh INSERT, UPDATE, DELETE hay các stored procedure

+ ExecuteScalar: Trả về một giá trị của một câu truy vấn, thường dùng để lấy các giá trị MIN, MAX, SUM, COUNT …

+ ExecuteReader: Cho một tập giá trị theo chuẩn của DataReader, thường dùng để đọc một bảng

- Đối tượng DataReader là kết quả của Command.ExcuteReader, thể hiện một luồng các bản ghi chỉ đọc (read-only)

- Đối tượng DataAdapter là công cụ giao tiếp giữa CSDL và DataSet, có 4 thuộc tính:
+ SelectCommand – một câu truy vấn đọc dữ liệu từ CSDL. Dữ liệu sẽ được điền vào DataTable khi thực hiện hàm DataAdapter.Fill()
+ Các InsertCommand, UpdateCommand và DeleteCommand – chỉ được sử dụng khi dữ liệu được SELECT từ một bảng, dùng để cập nhật CSDL khi thực hiện hàm DataAdapter.Update()

- Đối tượng DataSet: Tập hợp các DataTable. Các bảng dữ liệu trong CSDL có thể được đưa vào DataSet thông qua DataAdapter:

adapter.SelectCommand = “SELECT … FROM … “;

adapter.Fill(dataset);

- Đối tượng DataTable: Tập hợp các DataRow và DataColumn. DataTable có thể lấy dữ liệu trực tiếp từ DataReader:

DataTable table = new DataTable();

table.Load(command.ExecuteReader());

2. XÂY DỰNG ỨNG DỤNG “SỔ ĐỊA CHỈ”

- Thiết kế cơ sở dữ liệu;

- Thiết kế các chức năng;

- Xây dựng giao diện;

- Xây dựng AddressBookModel;

- Sử dụng AddressBookModel trong giao diện;

- Vấn đề lưu trữ dữ liệu giữa các lần postback.


2.1. THIẾT KẾ CƠ SỞ DỮ LIỆU

Tạo CSDL trên SQL Server 2005 với tên “AddressBook”.


CREATE DATABASE AddressBook

GO

USE AddressBook

GO

CREATE TABLE tblDiaChi

(

ID int primary key identity(1, 1),

Ho nvarchar(50),

Ten nvarchar(50),

DiaChi nvarchar(100),

DienThoai nvarchar(50),

Email nvarchar(50),

GhiChu nvarchar(100)

)
GO

Thủ tục thêm dữ liệu.


Thủ tục chỉnh sửa dữ liệu


 USE AddressBook


 GO

CREATE PROCEDURE dbo.UpdateDiaChi


Thủ tục xóa dữ liệu


2.2. THIẾT KẾ CÁC CHỨC NĂNG

Quy trình thực hiện các chức năng

Thủ tục nhập dữ liệu

2.3. XÂY DỰNG ADDRESSBOOKMODEL
- Model là đối tượng đóng vai trò như một giao diện giữa CSDL và các Control

- Gồm những chức năng chính:

+Kết nối CSDL;

+Thực hiện các chức năng thao tác CSDL:
Select
Insert
Update
Delete

Class AddressBookModel

using System; using System.Data;

using System.Data.SqlClient;

namespace ViDuADO

{

public partial class AddressBookModel

{

//  Kết nối CSDL

//  Hàm chạy query

//  Hàm Select

//  Hàm Insert

//  Hàm Update

//  Hàm Delete

}

}

 Kết nối CSDL


SqlConnection sqlConnection;

public string ConnectionString

{

set

{

this.sqlConnection = new SqlConnection(value);

}

}

public void OpenConnection()

{

if (this.sqlConnection.State == ConnectionState.Closed) this.sqlConnection.Open();

}

public void CloseConnection()

{

if (this.sqlConnection.State == ConnectionState.Open) this.sqlConnection.Close();

}

Hàm chạy query


void ExecuteQuery(SqlCommand comm)

{

try

{

// Mở Connection this.OpenConnection();

// Gọi hàm ExecuteNonQuery của Command comm.ExecuteNonQuery();
}

catch (Exception e)

{

throw new Exception(e.Message);

}

finally

{

// Đóng Connection this.sqlConnection.Close();

}

}


Hàm Select


public DataTable Select(string condition)

{

// Tạo SQL đọc select dữ liệu từ bảng

string sql = "select * from tblDiaChi order by ten, ho"; if (condition != "") sql += "where " + condition;

// Tạo đối tượng Command

SqlCommand comm = new SqlCommand(sql, sqlConnection);

// Mở Connection this.OpenConnection();

// Load dữ liệu trong Reader từ Command.ExecuteReader() DataTable table = new Datatable(); table.Load(comm.ExecuteReader());

// Đóng Connection this.sqlConnection.Close();

return table;

}
}

Hàm Insert



public object Insert( string Ho, string Ten, string DiaChi, string Email, string DienThoai, string GhiChu )
{

// Tạo đối tượng Command

SqlCommand comm = new SqlCommand(sql, sqlConnection); comm.CommandType = CommandType.StoredProcedure; comm.CommandText = "InsertDiaChi";

//  Tạo các tham số cho Command comm.Parameters.Add("@ID", SqlDbType.Int);

comm.Parameters.Add("@Ho", SqlDbType.NVarChar, 50).Value = Ho;

..............................................................

//  Đặt tham số đầu ra

comm.Parameters["@ID"].Direction = ParameterDirection.Output;

//  Gọi hàm chạy query this.ExecuteQuery(comm);

//  Trả về giá trị trường ID của bản ghi mới bổ sung return comm.Parameters["@ID"].Value;

}

Hàm Update


public void Update( object ID, string Ho, string Ten, string DiaChi, string Email, string DienThoai, string GhiChu )
{

// Tạo đối tượng Command

SqlCommand comm = new SqlCommand(sql, sqlConnection); comm.CommandType = CommandType.StoredProcedure; comm.CommandText = "UpdateDiaChi";

// Tạo các tham số cho Command comm.Parameters.Add("@ID", SqlDbType.Int).Value = ID;

comm.Parameters.Add("@Ho", SqlDbType.NVarChar, 50).Value = Ho;

..............................................................

// Gọi hàm chạy query this.ExecuteQuery(comm);

}

2.4. THIẾT KẾ GIAO DIỆN
Ứng dụng gồm 2 giao diện:

- Giao diện liệt kê danh mục các địa chỉ

+ Dùng DataList control để liệt kê dữ liệu, mỗi item có một button để yêu cầu cập nhật hoặc xóa dữ liệu;

+ Button yêu cầu thêm dữ liệu.

- Giao diện cập nhật hoặc thêm mới một địa chỉ

+ Các TextBox control để nhập dữ liệu;

+ Button yêu cầu cập nhật dữ liệu;

+ Button yêu cầu xóa dữ liệu;

+ Button yêu cầu trở về giao diện liệt kê danh mục.

Giao diện liệt kê danh mục địa chỉ


Giao diện cập nhật hoặc thêm mới một địa chỉ



2.5. SỬ DỤNG ADDRESSBOOKMODEL TRONG GIAO DIỆN

Dùng hàm thuộc tính để tạo model


AddressBookModel Model

{

get

{

//  Tạo một đối tượng AddressBookModel AddressBookModel model = new AddressBookModel();

//  Đặt giá trị cho thuộc tính ConnectionString của AddressBookModel

//  để tạo Connection

model.ConnectionString = @"Data Source=localhost; Initial Catalog=AddressBook; "

return model;

}

}

- Trong vòng đời của ứng dụng cần lưu trữ 2 đối tượng:

+ DataTable – chứa thông tin từ CSDL;

+ DataRow – chứa thông tin của bản ghi đang được cập nhật, có thể là một hàng trong DataTable hoặc một hàng cho bản ghi mới.

static DataTable dataTable;

static DataRow editingRow;

- Xử lý sự kiện Page_Load()


protected void Page_Load(object sender, EventArgs e)

{

if (!this.IsPostBack)

{

//   Đọc dữ liệu từ CSDL vào DataTable dataTable = this.Model.Select("");

//   Gọi hàm thể hiện giao diện liệt kê địa chỉ

this.ShowAddressList();

}

}


Hàm thể hiện giao diện liệt kê danh mục địa chỉ

 protected void ShowAddressList()

{
// Đưa giao dataTable lên DataList 
this.DataList1.DataSource = dataTable;
this.DataList1.DataBind(); 
// Thể hiện giao diện liệt kê địa chỉ 
this.bnInsert.Visible = true; this.Panel2.Visible = true; 
this.Panel3.Visible = false;
}

Xử lý sự kiện khi có yêu cầu thêm mới

 protected void bnInsert_Click(object sender, EventArgs e)

{

// Tạo một bản ghi mới và đưa vào editingRow 

// khi đó editingRow.State = DataRowState.Detached 
editingRow = dataTable.NewRow(); 

// Xóa các TextBox của giao diện cập nhật dữ liệu 

this.txtHo.Text = "";
this.txtTen.Text = ""; 
this.txtDiaChi.Text = "";
this.txtDienThoai.Text = "";
this.txtEmail.Text = "";
this.txtGhiChu.Text = "";

// Thể hiện giao diện cập nhật dữ liệu 
this.bnInsert.Visible = false; 
this.Panel2.Visible = false; 
this.Panel3.Visible = true;

}

Xử lý sự kiện khi có yêu cầu cập nhật một bản ghi


void DataList1_ItemCommand(object source, DataListCommandEventArgs e)

{

//  Lấy DataRow yêu cầu cập nhật từ DataTable editingRow = dataTable.Rows[e.Item.ItemIndex];

//  Đưa thông tin vào các TextBox

this.txtHo.Text = editingRow["Ho"].ToString(); this.txtTen.Text = editingRow["Ten"].ToString(); this.txtDiaChi.Text = editingRow["DiaChi"].ToString(); this.txtDienThoai.Text = editingRow["DienThoai"].ToString(); this.txtEmail.Text = editingRow["Email"].ToString(); this.txtGhiChu.Text = editingRow["GhiChu"].ToString();

// Thể hiện giao diện cập nhật dữ liệu this.bnInsert.Visible = false; this.Panel2.Visible = false; this.Panel3.Visible = true;

}

Xử lý sự kiện khi có yêu cầu xác nhận cập nhật trong giao diện cập nhật dữ liệu

void bnUpdate_Click(object source, EventArgs e)

{

// Lưu thông tin vào các biến cục bộ string Ho = this.txtHo.Text;

string Ten = this.txtTen.Text;

.......................................

object ID = editingRow["ID"];

//  Gọi hàm Insert() hoặc Update() của AddressBookModel để cập nhật CSDL if (editingRow.State = DataRowState.Detached)
ID = this.Model.Insert(Ho, Ten, DiaChi, DienThoai, Email, GhiChu);

else

this.Model.Update(ID, Ho, Ten, DiaChi, DienThoai, Email, GhiChu);

//  Cập nhật thông tin trên giao diện

editingRow.ItemArray = new object[] {

ID, Ho, Ten, DiaChi, DienThoai, Email, GhiChu };

//  Nếu đây là bản ghi mới thì thêm vào tập DataRow của DataTable if (editingRow.State = DataRowState.Detached)
dataTable.Rows.Add(editingRow);

//  Trở về giao diện liệt kê danh mục địa chỉ

this.ShowAddressList();


}

Xử lý sự kiện khi có yêu cầu xóa trong giao diện cập nhật dữ liệu


void bnDelete_Click(object source, EventArgs e)

{

// Gọi hàm Delete() của AddressBookModel để cập nhật CSDL this.Model.Delete(ID, Ho, Ten, DiaChi, DienThoai, Email, GhiChu);

//  Xóa bản ghi khỏi tập DataRow của DataTable dataTable.Rows.Remove(editingRow);

//  Trở về giao diện liệt kê danh mục địa chỉ

this.ShowAddressList();

}



2.6. VẤN ĐỀ LƯU TRỮ DỮ LIỆU GIỮA CÁC LẦN POSTBACK

- Các đối tượng của Page sẽ bị xóa khỏi bộ nhớ sau mỗi lần postback.

- Các phương pháp “giữ” đối tượng:

+ Dùng kiểu bộ nhớ static:

static DataTable dataTable;

+Dùng đối tượng Session:

* Là đối tượng do Web Server cung cấp;

* Các đối tượng được lưu trữ trong Session sẽ bị xóa sau một khoảng thời gian (tính bằng phút) do thuộc tính Session.TimeOut quy định.


2.6. VẤN ĐỀ LƯU TRỮ DỮ LIỆU GIỮA CÁC LẦN POSTBACK

Ví dụ sử dụng:



DataTable dataTable

{

get

{

return (DataTable)Session["Table"];

}

}

protected void Page_Load(object sender, EventArgs e)

{

if (!this.IsPostBack)

{

...

Session.Timeout = 10;

Session["Table"] = Model.Select("");

...

}

}







Dùng đối tượng Application:

* Đối tượng Application cung cấp một danh sách các vùng nhớ static cho các đối tượng trong suốt vòng đời của ứng dụng.

* Ví dụ sử dụng:

DataTable dataTable

{

get

{

return (DataTable)Application["Table"];

}

}

protected void Page_Load(object sender, EventArgs e)

{

if (!this.IsPostBack)

{

...

Application["Table"] = Model.Select("");

...

}

}





TỪ ĐIỂN THUẬT NGỮ

- ADO.NET (ActiveX Data Object for .NET): Công nghệ cho phép người lập trình truy cập và xử lý CSDL

- Data Provider: Công cụ tả CSDL (SQL Data Provider – mô tả CSDL Microsoft SQL Server)

- DataTable: Bảng dữ liệu tạm thời trong bộ nhớ, gồm tập hợp các hàng và các cột dữ liệu

- DataColum: Cột dữ liệu trong DataTable, mô tả một thuộc tính trong một quan hệ

- DataRow: Hàng dữ liệu trong DataTable, mô tả một bộ trong một quan hệ

- DataRowCollection: Danh sách liên kết của các DataRow

- DataColumnCollection: Danh sách liên kết của các DataColumn

--------------------------------------------------------------------------------------------------
Download Bai3.mp3
---------------------------------------------------------------------------------------------------
BACK TO TOP
Skype: vdtrungkt