Top Banner
KIN TRÚC ADO.NET VÀ MÔ HÌNH 3 TNG TRONG PHÁT TRI N NG DNG WEB Đỗ Ngọc Cường ITDLU Email: [email protected]
15
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: ADO.NET

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]

Page 2: ADO.NET

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

Page 3: ADO.NET

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)

Page 4: ADO.NET

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.

Page 5: ADO.NET

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();

Page 6: ADO.NET

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

Page 7: ADO.NET

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

Page 8: ADO.NET

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();

Page 9: ADO.NET

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

Page 10: ADO.NET

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

Page 11: ADO.NET

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();

Page 12: ADO.NET

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.

Page 13: ADO.NET

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

Page 14: ADO.NET

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

Page 15: ADO.NET

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