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

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
---------------------------------------------------------------------------------------------------

Không có nhận xét nào:

Đăng nhận xét

BACK TO TOP
Skype: vdtrungkt