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

kien truc ado net va mo hinh 3 tang trong phat trien ung dung web

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 (514.99 KB, 15 trang )

KIẾN TRÚC ADO.NET VÀ
MÔ HÌNH 3 TẦNG TRONG PHÁT TRIỂN
ỨNG DỤNG WEB
Đỗ Ngọc Cường – ITDLU
Email:


MỤC LỤC
Kiến trúc ADO.NET ......................................................................................................... 2
Trình cung cấp dữ liệu ADO.NET ................................................................................... 2
Các lớp thuộc SQL Server provider ................................................................................ 3
Lớp SqlConnection.......................................................................................................... 3
Tạo đối tượng SqlConnection ...................................................................................... 3
Lớp SqlCommand ........................................................................................................... 4
Tạo đối tượng SqlCommand ....................................................................................... 4
Các phương thức SqlCommand .................................................................................. 4
Lớp SqlDataReader ........................................................................................................ 5
Các phương thức SqlDataReader ............................................................................... 5
Các bước thực hiện một truy vấn trong ADO.NET .......................................................... 5
Các ví dụ ......................................................................................................................... 5
Chèn thêm một hàng vào vào bảng Employees .......................................................... 6
Cập nhật một hàng trong bảng Employees ................................................................. 7
Xóa một hàng trong bảng Employees.......................................................................... 8
Đếm tất cả hàng trong bảng Employees...................................................................... 8
Lấy tất cả hàng trong bảng Employees ....................................................................... 9
Đọc nhiều tập dữ liệu................................................................................................. 10
Mô hình 3 tầng (three tier) ............................................................................................. 11
Mục đích .................................................................................................................... 11
Ví dụ .............................................................................................................................. 12

1




Kiến trúc ADO.NET
ADO.NET sử dụng kiến trúc nhiều tần xoay quanh một vài khái niệm chính như là
Connection, Command, và các đối tượng DataSet
Một trong những điểm khác biệt nhất giữa ADO.NET với một vài công nghệ CSDL khác
là cách mà ADO.NET tương tác với các loại nguồn dữ liệu khác: tập tin văn bản, excel,
XML, cở sở dữ liệu (CSDL)

Trình cung cấp dữ liệu ADO.NET
Trình cung cấp dữ liệu (data provider) là một tập các lớp ADO.NET cho phép truy cập
vào một CSDL cụ thể, thực thi các câu lệnh truy vấn, và lấy dữ liệu. Về cơ bản, một
trình cung cấp dữ liệu là cầu nối giữa ứng dụng và một nguồn dữ liệu (data source)
Các lớp tạo nên một trình cung cấp dữ liệu bao gồm:
Connection: sử dụng đối tượng này để thiết lập kết nối với một nguồn dữ liệu
Command: sử dụng đối tượng này để thực thi các câu lệnh truy vấn và các thủ
tục (stored procedure)
DataReader: cung cấp cách đọc dữ liệu nhanh và tuần tự
DataAdapter: có 2 cách dùng. Cách thứ nhất là dùng để đổ dữ liệu từ CSDL vào
DataSet. Cách còn lại là dùng để cập nhật dữ liệu từ DataSet và đồng hóa các
thay đổi đó với CSDL
ADO.NET không bao gồm các đối tượng data provider chung. Thay vào đó, nó bao
gồm các data provider được thiết kế riêng biệt cho các loại nguồn dữ liệu khác
nhau. Mỗi loại data provider đều có các lớp Connect, Command, DataReader,
DataAdapter và được cụ thể hóa (implement) để tối ưu cho hệ quản trị cơ sở dữ liệu
đó. Ví dụ, nếu bạn cần tạo ra một kết nối đến một cơ sở dữ liệu SQL Server, bạn sẽ sử
dụng một lớp connection tên là SqlConnection.
ADO.NET bao gồm 4 loại data provider:
SQL Server provider: được dùng để truy cập vào CSDL SQL Server (phiên bản
7.0 trở về sau)

OLE DB provider: được dùng để truy cập tới bất kỳ nguồn dữ liệu hổ trợ chuẩn
OLE DB (Object Linking and Embedding for Databases) như Access, Excel,
Oracle, SQL Server phiên bản trước 7.0
Oracle provider: được dùng để truy cập vào CSDL Oracle (phiên bản 8i trở về
sau)
ODBC provider: được dùng để kết nối tới các cơ sở dữ liệu có hỗ trợ chuẩn
ODBC (Open Database Connectivity)
2


.NET
Application

SQL Server .NET
Provider

OLE DB .NET
Provider

Oracle .NET
Provider

OLE DB
Provider

SQL Server
Database

Data Source


Oracle
Database

Hình 1. Kiến trúc ADO.NET

Các lớp thuộc SQL Server provider
SqlConnection
SqlCommand
SqlDataReader
SqlDataAdapter

Lớp SqlConnection
Đối tượng SqlConnection được sử dụng để kết nối tới một CSDL SQL Server.

Tạo đối tượng SqlConnection
SqlConnection cnn =
new SqlConnection("server=localhost;database=Northwind;uid=sa;pwd=sa");

Trong đó:
server: là tên của máy tính đang chạy SQL Server.
database: là tên cơ sở dữ liệu muốn kết nối.
3


uid: là tên người dùng cơ sở dữ liệu.
pwd: là mật khẩu tương ứng của người dùng.

Lớp SqlCommand
Đối tượng SqlCommand được sử dụng để thực thi một câu lệnh truy vấn tới CSDL SQL
Server


Tạo đối tượng SqlCommand
Tạo đối tượng SqlCommand đại diện cho một câu truy vấn
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;

SqlCommand cmd = cnn.CreateCommand();

cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM Employees";

Tạo đối tượng SqlCommand đại diện cho một thủ tục
SqlCommand cmd = new SqlCommand("GetEmployees", cnn);
cmd.CommandType = CommandType.StoredProcedure;

hoặc
SqlCommand cmd = cnn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "GetEmployees";

Các phương thức SqlCommand
Phương thức

Mô tả

ExecuteNonQuery()

Thực thi một câu lệnh SQL không trả về tập kết quả như
INSERT, UPDATE, DELETE, CREATE, ALTER, DROP. Giá
trị trả về của hàm này chính là số dòng bị ảnh hưởng khi

thực thi truy vấn.

ExecuteScalar()

Thực thi lệnh câu lệnh SQL và trả về giá trị cột đầu tiên của
hàng đầu tiên, những giá trị thừa bị loại bỏ. Phương thức này
thường được sử dụng khi thực thi một lệnh SELECT có sử
dụng các hàm kết hợp như COUNT (), SUM () …

ExecuteReader()

Thực hiện một truy vấn SELECT và trả về một đối tượng
DataReader.

4


Lớp SqlDataReader
Đối tượng SqlDataReader cho phép đọc dữ liệu trả về từ câu lệnh SELECT một cách
tuần tự, mỗi lần đọc một hàng

Các phương thức SqlDataReader
Phương thức

Mô tả

Read()

Chuyển DataReader đến dòng tiếp theo trong tập kết quả và
đọc dữ liệu trên dòng đó. Trả về giá trị False khi không còn

dòng để đọc

GetInt32(), GetChar(),
GetDateTime(), Get…()

Lấy giá trị của một cột (theo chỉ số) của hàng hiện tại, trả về
kiểu dữ liệu được quy định như tên các phương thức

NextResult()

Nếu dữ liệu trả về từ câu lệnh SQL có nhiều hơn 2 tập kết
quả thì phương thức này sẽ chuyển DataReader đến tập kết
quả tiếp theo

Close()

Đóng DataReader

Các bước thực hiện một truy vấn trong ADO.NET
1.
2.
3.
4.
5.
6.
7.

Tạo đối tượng SqlConnection
Tạo đối tượng SqlCommand đại diện cho một lệnh truy vấn
Truyền các tham số vào đối tượng SqlCommand (nếu có)

Mở kết nối
Gọi phương thức Execute tương ứng
Xử lý kết quả trả về của bước 5
Đóng kết nối

Chú ý: Bước 6 & 7 có thể hoán đổi nhau tùy cách xử lý kết quả trả về từ câu truy vấn

Các ví dụ
Các ví dụ dưới đây thực hiện trên bảng Employees của CSDL Northwind
Employees
Coumn Name

Data Type

EmployeeID

int

TitleOfCourtesy

nvarchar(25)

LastName

nvarchar(20)

FirstName

nvarchar(10)


HireDate

datetime
5


Chèn thêm một hàng vào vào bảng Employees
Câu lệnh SQL để tạo thủ tục Employees_Add
CREATE PROCEDURE Employees_Add
@EmployeeID
int OUTPUT,
@TitleOfCourtesy varchar(25),
@LastName
varchar(20),
@FirstName
varchar(10)
AS
INSERT INTO Employees
(TitleOfCourtesy, LastName, FirstName, HireDate)
VALUES (@TitleOfCourtesy, @LastName, @FirstName, GETDATE());
SET @EmployeeID = @@IDENTITY

C#
private static int Add(string title, string lastName, string firstName)
{
// 1. Tao doi tuong SqlConnection
// 1.1 Tao chuoi noi
string connectionString = @"server=.\sqlexpress;database=northwind;integrated
security=true";
// 1.2 Tao doi tuong SqlConnection voi chuoi ket noi o tren

using (SqlConnection cnn = new SqlConnection(connectionString))
{
// 2. Tao doi tuong SqlCommand
SqlCommand cmd = cnn.CreateCommand();
// 2.1 Dai dien cho mot thu tuc
cmd.CommandType = CommandType.StoredProcedure;
// 2.2 Truyen ten thu tuc ma doi tuong SqlCommand se goi
cmd.CommandText = "Employees_Add";
// 3. Truyen cac tham so
cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Direction =
ParameterDirection.Output;
cmd.Parameters.Add("@TitleOfCourtesy", SqlDbType.VarChar, 25).Value = title;
cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 20).Value = lastName;
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 20).Value = firstName;
// 4. Mo ket noi
cnn.Open();
// 5. Goi ExecuteNonQuery() de thu hien cau truy van
// rs chinh la so hang duoc chen them vao bang
int rs = cmd.ExecuteNonQuery();
// 6. Xy ly ket qua tra ve
if (rs > 0)
{
// 6.1 Lay gia tri EmployeeID cua hang vua duoc them vao
int empID = (int)cmd.Parameters["@EmployeeID"].Value;
return empID;
}
else
{
Console.WriteLine("Insert fail");
}

// 7. Dong ket noi

6


cnn.Close();
return 0;
}
}

Cập nhật một hàng trong bảng Employees
Câu lệnh SQL để tạo thủ tục Employees_Update
CREATE PROCEDURE [Employees_Update]
@EmployeeID
int,
@TitleOfCourtesy varchar(25),
@LastName
varchar(20),
@FirstName
varchar(10)
AS
UPDATE Employees
SET TitleOfCourtesy = @TitleOfCourtesy,
LastName = @LastName,
FirstName = @FirstName
WHERE EmployeeID = @EmployeeID

C#
private static int Update(int empID, string title, string lastName, string firstName)
{

// 1. Tao doi tuong SqlConnection
// 1.1 Tao chuoi noi
string connectionString = @"server=.\sqlexpress;database=northwind;integrated
security=true";
// 1.2 Tao doi tuong SqlConnection voi chuoi ket noi o tren
using (SqlConnection cnn = new SqlConnection(connectionString))
{
// 2. Tao doi tuong SqlCommand
SqlCommand cmd = cnn.CreateCommand();
// 2.1 Dai dien cho mot thu tuc
cmd.CommandType = CommandType.StoredProcedure;
// 2.2 Truyen ten thu tuc ma doi tuong SqlCommand se goi
cmd.CommandText = "Employees_Update";
// 3. Truyen cac tham so
cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = empID;
cmd.Parameters.Add("@TitleOfCourtesy", SqlDbType.VarChar, 25).Value = title;
cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 20).Value = lastName;
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 20).Value = firstName;
// 4. Mo ket noi
cnn.Open();
// 5. Goi ExecuteNonQuery() de thuc hien cau truy van
// rs chinh la so hang duoc cap nhat
int rs = cmd.ExecuteNonQuery();
// 6. Dong ket noi
cnn.Close();

7


// 7. Tra ve ket qua

return rs;
}
}

Xóa một hàng trong bảng Employees
Câu lệnh SQL để tạo thủ tục Employees_Delete
CREATE PROCEDURE [Employees_Delete]
@EmployeeID
int
AS
DELETE Employees WHERE EmployeeID = @EmployeeID

C#
private static int Delete(int empID)
{
// 1. Tao doi tuong SqlConnection
// 1.1 Tao chuoi noi
string connectionString =
@"server=.\sqlexpress;database=northwind;integrated security=true";
// 1.2 Tao doi tuong SqlConnection voi chuoi ket noi o tren
using (SqlConnection cnn = new SqlConnection(connectionString))
{
// 2. Tao doi tuong SqlCommand
SqlCommand cmd = cnn.CreateCommand();
// 2.1 Dai dien cho mot thu tuc
cmd.CommandType = CommandType.StoredProcedure;
// 2.2 Truyen ten thu tuc ma doi tuong SqlCommand se goi
cmd.CommandText = "Employees_Delete";
// 3. Truyen cac tham so
cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = empID;

// 4. Mo ket noi
cnn.Open();
// 5. Goi ExecuteNonQuery() de goi thu hien cau truy van
// rs chinh la so hang bi xoa khoi bang
int rs = cmd.ExecuteNonQuery();
// 6. Dong ket noi
cnn.Close();
// 7. Tra ve ket qua
return rs;
}
}

Đếm tất cả hàng trong bảng Employees
Câu lệnh SQL để tạo thủ tục Employees_Count
8


CREATE PROCEDURE [Employees_Count]
AS
SELECT COUNT(EmployeeID) FROM Employees

C#
public static int Count()
{
// 1. Tao doi tuong SqlConnection
// 1.1 Tao chuoi noi
string connectionString =
@"server=.\sqlexpress;database=northwind;integrated security=true";
// 1.2 Tao doi tuong SqlConnection voi chuoi ket noi o tren
using (SqlConnection cnn = new SqlConnection(connectionString))

{
// 2. Tao doi tuong SqlCommand
SqlCommand cmd = cnn.CreateCommand();
// 2.1 Dai dien cho mot thu tuc
cmd.CommandType = CommandType.StoredProcedure;
// 2.2 Truyen ten thu tuc ma doi tuong SqlCommand se goi
cmd.CommandText = "Employees_Count";
// 3. Truyen cac tham so
// 4. Mo ket noi
cnn.Open();
// 5. Goi ExecuteScalar() lay ket qua (cot 1 hang 1)
int rs = Convert.ToInt32(cmd.ExecuteScalar());
// 6. Dong ket noi
cnn.Close();
// 7. Tra ve ket qua
return rs;
}
}

Lấy tất cả hàng trong bảng Employees
Câu lệnh SQL để tạo thủ tục Employees_All
CREATE PROCEDURE [Employees_All]
AS
SELECT * FROM Employees

C#
private static void All()
{
// 1. Tao doi tuong SqlConnection
// 1.1 Tao chuoi noi

string connectionString = @"server=.\sqlexpress;database=northwind;integrated
security=true";
// 1.2 Tao doi tuong SqlConnection voi chuoi ket noi o tren
9


using (SqlConnection cnn = new SqlConnection(connectionString))
{
// 2. Tao doi tuong SqlCommand
SqlCommand cmd = cnn.CreateCommand();
// 2.1 Dai dien cho mot thu tuc
cmd.CommandType = CommandType.StoredProcedure;
// 2.2 Truyen ten thu tuc ma doi tuong SqlCommand se goi
cmd.CommandText = "Employees_All";
// 3. Truyen cac tham so
// 4. Mo ket noi
cnn.Open();
// 5 + 6. Goi ExecuteReader() va doc qua tung hang cua bang ket qua
using (IDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
// 6.1 Doc tuan tu tung hang
while (dr.Read())
{
// 6.2 Xuat du lieu cua hang hien tai
Console.WriteLine(String.Format("{0} {1} {2}",
dr["EmployeeID"],
// lay du lieu cot EmpID
dr["LastName"],
// lay du lieu cot LastName
dr["FirstName"])); // lay du lieu cot FirstName

}
}
// 7. Dong ket noi
cnn.Close();
}
}

Đọc nhiều tập dữ liệu
Câu lệnh SQL để tạo thủ tục Employees_Multi
CREATE PROCEDURE [Employees_Multi]
AS
SELECT TOP 5 * FROM Employees
SELECT TOP 5 * FROM Customers

C#
public static void ReadMultipleResultSets()
{
// 1. Tao doi tuong SqlConnection
// 1.1 Tao chuoi noi
string connectionString = @"server=.\sqlexpress;database=northwind;integrated
security=true";
// 1.2 Tao doi tuong SqlConnection voi chuoi ket noi o tren
using (SqlConnection cnn = new SqlConnection(connectionString))
{
// 2. Tao doi tuong SqlCommand
SqlCommand cmd = cnn.CreateCommand();

10



// 2.1 Dai dien cho mot thu tuc
cmd.CommandType = CommandType.StoredProcedure;
// 2.2 Truyen ten thu tuc ma doi tuong SqlCommand se goi
cmd.CommandText = "Employees_Multi";
// 3. Truyen cac tham so
// 4. Mo ket noi
cnn.Open();
// 5 + 6. Goi ExecuteReader() va doc qua tung hang cua bang ket qua
using (IDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
// 6.1 Doc tap du lieu dau tien (Employees)
while (dr.Read())
{
// 6.1 Xuat du lieu cua hang hien tai
Console.WriteLine(String.Format("{0} {1} {2}",
dr["EmployeeID"],
// lay du lieu cot EmpID
dr["LastName"],
// lay du lieu cot LastName
dr["FirstName"])); // lay du lieu cot FirstName
}
// 6.2 Doc tap du lieu tiep theo (Customers)
dr.NextResult();
while (dr.Read())
{
// 6.3 Xuat du lieu cua hang hien tai
Console.WriteLine(String.Format("{0} {1} {2}",
dr["CustomerID"],
// lay du lieu cot CusID
dr["CompanyName"],

// lay du lieu cot CompanyName
dr["ContactName"])); // lay du lieu cot ContactName
}
}
// 7. Dong ket noi
cnn.Close();
}
}

Mô hình 3 tầng (three tier)
Chia nhỏ chức năng của ứng dụng thành các thành phần dựa trên công việc mà thành
phần đó thực hiện và nhóm mỗi thành phần đó thành một tầng.

Mục đích
Phát triển phần mềm dựa trên mô hình 3 tầng cho phép các lập trình viên có thể cập
nhật, thay đổi chức năng của mỗi tầng riêng biệt mà không phá vỡ code của các tầng
khác.

11


Presentation Tier
ASP.NET Master Pages
ASP.NET Web Forms
ASP.NET Web User Controls

Business Tier
ASP.NET Master Pages
C# Class
SQL Server

Data Tier
ASP.NET Master Pages
SQL Server Stored Procedures

ASP.NET Data
Master Pages
SQL Server Data Store

Tên và chức năng của mỗi tầng trong mô hình 3 tầng

Ví dụ
Giả sử người dùng sử dụng trình duyệt và vào trang web bán hàng trực tuyến như hình
dưới

12


Để thêm một sản phẩm vào giỏ hàng thi người dùng sẽ bấm vào nút Add To Cart. Hình
dưới cho thấy luồng thông tin chạy qua các tầng của ứng dụng
Người dùng sử dụng trình duyệt





Internet

Ứng dụng Web 3 tầng được
host trên Web Server




Presentation Tier





Business Tier



Data Tier



Sự tương tác của người dùng với 3 tầng của ứng dụng
13


1. Người dùng bấm vào nút Add To Cart để thêm sản phẩm vào giỏ hảng
2. Tầng Presentation chuyển yêu cầu đến tầng Business là “Tôi muốn thếm sản
phẩm này vào giỏ hàng”
3. Tầng Business nhận yêu cầu và nói tầng Data “Cập nhật giỏ hàng của người
dùng bằng cách thêm vào sản phẩm đã chọn”
4. Tầng Data cập nhật vào CSDL và trả kết quả cho tầng Business
5. Tầng Business sẽ xử lý kết quả và tất cả lỗi xảy ra trong quá trình cập nhật giỏ
hàng. Sau đó, tầng Business sẽ trả kết quả mà nó đã xử lý được cho tầng
Presentation
6. Tầng Presentation sẽ tạo ra giao diện giỏ hàng ở trạng thái đã cập nhật

7. Phần giao diện sẽ được chuyển thành HTML và trả về trình duyệt của người
dùng

14



×