Upload
nguyen-dinh-chinh
View
39
Download
8
Tags:
Embed Size (px)
Citation preview
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: [email protected]
1
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
2
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)
3
.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.
4
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; 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.
SqlCommand cmd = cnn.CreateCommand();
5
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. Tạo đối tượng SqlConnection
2. Tạo đối tượng SqlCommand đại diện cho một lệnh truy vấn
3. Truyền các tham số vào đối tượng SqlCommand (nếu có)
4. Mở kết nối
5. Gọi phương thức Execute tương ứng
6. Xử lý kết quả trả về của bước 5
7. Đó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
6
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
7
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();
8
// 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
9
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
10
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();
11
// 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.
12
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
Presentation Tier
ASP.NET Master Pages
ASP.NET Web Forms
ASP.NET Web User Controls
ASP.NET Master Pages
Business Tier
C# Class
ASP.NET Master Pages
Data Tier
SQL Server Stored Procedures
ASP.NET Master Pages
Data
SQL Server Data Store
SQL Server
13
Để 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
Sự tương tác của người dùng với 3 tầng của ứng dụng
Người dùng sử dụng trình duyệt
Ứng dụng Web 3 tầng được
host trên Web Server
Presentation Tier
Business Tier
Data Tier
Internet
14
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