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("");
...
}
}
- 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ụ mô 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
---------------------------------------------------------------------------------------------------