Tải bản đầy đủ (.docx) (114 trang)

Tài liệu học lập trình web 2

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 (2.05 MB, 114 trang )

TRƯỜNG TRUNG CẤP KINH TẾ KỸ THUẬT

NGUYỄN HỮU CẢNH


TÀI LIỆU MÔN HỌC

LẬP TRÌNH WEB 2

Lưu hành nội bộ
2015


LỜI NÓI ĐẦU
Nhằm đổi mới phương pháp giảng dạy, nâng cao chất lượng giáo dục chuyên nghiệp
và đào tạo theo nhu cầu xã hội. Trường Trung cấp Kinh tế Kỹ thuật Nguyễn Hữu Cảnh
biên soạn tài liệu giảng dạy trình độ Trung cấp chuyên nghiệp tất cả các môn học thuộc
các ngành, chuyên ngành đào tạo tại trường, giúp cho học sinh có điều kiện học tập, nâng
cao tính tự học và sáng tạo.
Tài liệu giảng dạy môn Lập trình Web 2 thuộc học phần chuyên ngành của ngành đào
tạo Tin học ứng dụng.
Sau khi học xong môn học này, học sinh có khả năng :
Kiến thức :
-

Trình bày được kiến thức về lập trình ASP.NET, sử dụng cơ sở dữ liệu SQL Sever,
ASP.NET để lâp trình quản lý website trên Môi trường Visual Studio.

-

Có các kiến thức về thao tác cơ sở dữ liệu và xử lý code viết phần mềm quản lý.



Kỹ năng:
-

Sử dụng được các công cụ, các chức năng cơ bản của các Control, Database để
xây dựng phần mềm quản lý website có.

Thái độ:
-

Rèn luyện tác phong làm việc, đức tính cẩn thận, chính xác, khoa học.

Thời lượng và nội dung môn học:
Thời lượng : Lý thuyết 30 tiết; Thực hành 60 tiết
Nội dung môn học gồm các chương:
Bài 1 : Giới thiệu ADO.NET
Bài 2 : Tìm hiểu và ứng dụng cơ chế Data Binding
Bài 3 : Các đối tượng dữ liệu (Data Controls)
Trong quá trình biên soạn tài liệu này tác giả đã chọn lọc những kiến thức cơ bản, bổ
ích nhất, có chất lượng nhằm đáp ứng tốt nhu cầu giảng dạy của giáo viên và học tập của
học sinh bậc Trung cấp chuyên nghiệp tại trường.
Tuy nhiên, quá trình thực hiện không thể tránh những thiếu sót, tác giả rất mong nhận
được sự đóng góp của quý thầy cô đồng nghiệp và các em học sinh để hiệu chỉnh tài liệu
giảng dạy ngày càng hiệu quả hơn.
Trân trọng cảm ơn.


MỤC LỤC
LỜI NÓI ĐẦU



BÀI 1. GIỚI THIỆU ADO.NET
Sau bài học này, học sinh có khả năng
 Kiến thức :

Trình bày được cơ chế hoạt động và cách sử dụng ADO.NET.
Kỹ năng:

Sử dụng được ADO.NET cho ứng dụng web.
Thái độ:
Rèn luyện tác phong làm việc, đức tính cẩn thận, chính xác, khoa học.

1.1. KIẾN TRÚC ADO.NET
ADO.NET là tập các lớp cung cấp dịch vụ truy cập dữ liệu hỗ trợ cho lập trình viên trên
nền tảng .NET. ADO.NET cung cấp các thành phần tham gia vào việc xây dựng ứng
dụng chia sẻ dữ liệu và phân tán. Đây là phần tích hợp sẵn của nền tảng .NET giúp truy
cập dữ liệu quan hệ, XML một cách dễ dàng.
Trước đây, việc xử lý dữ liệu chủ yếu dựa vào việc kết nối trực tiếp đến cơ sở dữ liệu
theo mô hình hai lớp. Hiện nay, các ứng dụng xử lý dữ liệu đã sử dụng mô hình nhiều
lớp, lập trình viên có thể tiếp cận kỹ thuật ngắt kết nối nhằm mang lại hiệu quả cho
những ứng dụng lớn.
1.1.1. Các thành phần của ADO.NET
Hai thành phần chính của ADO.NET phục vụ cho việc truy cập và xử lý dữ liệu là trình
cung cấp dữ liệu dựa trên nền tảng .NET và đối tượng DataSet
1.1.1.1. Trình cung cấp dữ liệu ADO.NET
Là các thành phần được thiết kế trực tiếp truy cập dữ liệu, chúng có tính năng xử lý
nhanh, tuy nhiên chỉ cho phép chỉ đọc và duyệt các mẫu tin theo một chiều tới duy nhất.
Gồm các thành phần đối tượng sau :
- Đối tượng Connection cung cấp các phương thức kết nối đến nguồn dữ liệu.
- Đối tượng Command cho phép truy cập đến các câu lệnh SQL liên quan đến cơ

sở dữ liệu và nhận kết quả từ việc thực thi các câu lệnh SQL này.
- Đối tượng DataReader dùng để duyệt các mẫu tin trả về từ đối tượng Command.
- Đối tượng DataAdapter là cầu nối giữa đối tượng DataSet với nguồn dữ liệu
1.1.1.2. Đối tượng DataSet
Được thiết kế cho việc truy cập dữ liệu độc lập với bất kỳ nguồn dữ liệu nào. DataSet
chứa tập hợp các đối tượng bảng DataTable gồm nhiều dòng , nhiều cột dữ liệu và khóa
chính, khóa ngoại hay ràng buộc toàn vẹn.
1.1.1.3. Lựa chọn giữa DataReader với DataSet
Sử dụng DataSet khi
- Nhận dữ liệu từ nguồn dữ liệu và chuyển sang cục bộ cho ứng dụng xử lý
- Điều khiển dữ liệu giữa các lớp của mô hình ứng dụng
4/114


-

Tích hợp dữ liệu động vào các điều khiển của ASP.NET Server hoặc kết hợp dữ
liệu từ nhiều nguồn khác nhau.
- Xử lý dữ liệu mà không cần phải mở kết nối đến cơ sở dữ liệu.
Sử dụng DataReader khi
- Duyệt các mẫu tin nhanh chóng
- Tiết kiệm bộ nhớ phải lưu dữ liệu như DataSet để tăng tốc thực thi chương trình
1.1.2. LINQ to DataSet
Cung cấp khả năng truy vấn và kiểm tra biên dịch theo thời gian trên dữ liệu lưu trữ trong
DataSet. Cho phép viết các câu truy vấn bằng các ngôn ngữ lập trình như C# hay Visual
Basic trên nền tảng .NET.
1.1.3. LINQ to SQL
Hỗ trợ các câu truy vấn cho một mô hình đối tượng được ánh xạ đến cấu trúc dữ liệu của
một cơ sở dữ liệu quan hệ mà không cần sử dụng mô hình khái niệm. Mỗi bảng trong cơ
sở dữ liệu được biểu diễn thành một lớp (class). Các câu truy vấn trong mô hình đối

tượng sẽ được chuyển thành ngôn ngữ SQL và gởi đến cơ sở dữ liệu để thực hiện. Khi cơ
sở dữ liệu trả kết quả, LINQ to SQL sẽ chuyển kết quả này trở thành các đối tượng.
1.1.4. ADO.NET Entity Framework
Cho phép lập trình viên tạo ứng dụng truy cập dữ liệu bằng cách lập trình theo mô hình
khái niệm thay vì trực tiếp sử dụng mô hình quan hệ của cơ sở dữ liệu. Mục đích làm
giảm khối lượng mã lệnh và bảo trì các yêu cầu cho các ứng dụng xử lý dữ liệu.
1.1.5. Dịch vụ dữ liệu WCF
Dùng để triển khai dịch vụ dữ liệu trên Web hay mạng cục bộ. Dữ liệu có cấu trúc như
một thực thể và có mối quan hệ như đặc tả của mô hình dữ liệu thực thể.

Hình 1.1. Kiến trúc ADO.NET
1.2. TRÌNH CUNG CẤP DỮ LIỆU CỦA ADO.NET
Được dùng để kết nối đến cơ sở dữ liệu, thực thi câu lệnh và lấy kết quả. Những kết quả
này được xử lý trực tiếp cũng như gián tiếp khi cần bằng cách đặt toàn bộ kết quả vào đối
tượng DataSet. Trình cung cấp dữ liệu tạo cầu nối giữa nguồn dữ liệu và mã lệnh, tăng
tính thi hành mà không phải sử dụng nhiều mã lệnh.
Bảng 1.1. Danh sách các trình cung cấp dữ liệu trong .NET
5/114


Tên Trình Cung Cấp Dữ liệu

Mô Tả

Trình cung cấp dữ liệu cho SQL Server

Dùng để truy cập đến cơ sở dữ liệu MS SQL
Server từ phiên bản 7.0 trở về sau. Sử dụng
namespace ystem.Data.SqlClient


Trình cung cấp dữ liệu cho OLEDB

Dùng truy cập các nguồn dữ liệu thông qua đối
tượng
OLEDB.
Sử
dụng
namespace
System.Data.OleDb

Trình cung cấp dữ liệu cho ODBC

Dùng truy cập các nguồn dữ liệu thông qua đối
tượng
ODBC.
Sử
dụng
namespace
System.Data.Odbc

Trình cung cấp dữ liệu cho Oracle

Dùng truy cập nguồn dữ liệu Oracle. Hỗ trợ
Oracle từ phiên bản 8.1.7 trở về sau. Sử dụng
namespace System.Data.OracleClient

Trình cung cấp dữ liệu cho EntityClient

Dùng truy cập dữ liệu theo mô hình dữ liệu thực
thể.

Sử
dụng
namespace
System.Data.EntityClient

Bảng 1.2. Danh sách các đối tượng quan trọng của trình cung cấp dữ liệu
Tên đối tượng

Mô tả

Connection

Thiết lập kết nối đến nguồn dữ liệu bất kỳ.

Command

Thực thi câu lệnh truy cập trên nguồn dữ liệu.

DataReader

Đọc từng mẫu tin tuần tự từ đầu cho đến cuối
danhs sách. Không đi ngược lại.

DataAdapter

Đổ nguồn dữ liệu vào DataSet và thực hiện cập
nhật từ DataSet trở lại nguồn dữ liệu.

1.3. CÁC NAMESPACE CỦA ADO.NET
Phần này chúng ta sẽ tìm hiểu các namespace của ADO.NET

1.3.1. Namespace cho SQL Server (SQLClient)
Sử dụng giao thức dành riêng cho việc kết nối đền SQL Server. Namespace này sẽ giúp
tối ưu hóa việc truy cập trực tiếp đến SQL Server mà không cần phải có thêm các tầng
dịch vụ khác như OLEDB hay ODBC.

6/114


Hình 1.2. So sánh ưu điểm kết nối nguồn dữ liệu giữa SQLClient với OLEDB
Tuy nhiên để sử dụng được namespace cho SQL Server, ta phải cài đặt phiên bản từ 7.0
(2005) trở về sau. Các lớp của trình cung cấp dữ liệu cho SQL Server được đặt trong
namespace System.Data.SqlClient. Với những phiên bản trước, ta phải sử dụng trình
cung cấp dữ liệu cho OLEDB, các lớp trong trình này được đặt trong namespace
System.Data.OleDb.
Đoạn mã gọi namspace cho SQL Server sử dụng trong chương trình

using System.Data.SqlClient;

1.3.2. Namespace cho OLEDB
Sử dụng công nghệ COM để truy cập dữ liệu và có thể kết nối đến nhiều nguồn dữ liệu
khác nhau như (Oracle, SQL Server, MS Access…)
Bảng 1.3. Danh sách các driver hỗ trợ truy cập các nguồn dữ liệu
Tên Driver

Trình Cung Cấp

SQLOLEDB

Microsoft OLE DB cho SQL Server


MSDAORA

Microsoft OLE DB cho Oracle

Microsoft.Jet.OLEDB.4.0

OLE DB cho Jet (MS Access)

Các lớp của trình cung cấp dữ liệu cho OLE DB được đặt trong namespace
System.Data.OleDb.
Đoạn mã gọi namspace cho OLEDB sử dụng trong chương trình

using System.Data.OleDb;

1.3.3. Namespace cho Oracle (OracleClient)
Cho phép truy cập nguồn dữ liệu Oracle thông qua phần mềm kết nối Oracle Client.
Trình cung cấp dữ liệu này hỗ trợ Oracle từ phiên bản 8.1.7 trở về sau. Các lớp của trình
cung cấp dữ liệu cho Oracle được đặt trong namespace System.Data.OracleClient.
Đoạn mã gọi namspace cho Oracle sử dụng trong chương trình

using System.Data;
using System.Data.OracleClient;

7/114


1.3.4. Namespace cho ODBC
Sử dụng trình quản lý điều khiển ODBC để truy cập dữ liệu. ODBC này thường có sẵn
trong hệ điều hành MS Windows. Các lớp của trình cung cấp dữ liệu cho ODBC được đặt
trong namespace System.Data.Odbc

Đoạn mã gọi namspace cho ODBC sử dụng trong chương trình

using System.Data.Odbc;
1.4. TÌM HIỂU CƠ CHẾ KẾT NỐI CỦA ADO.NET QUA CONNECTED LAYER
Chức năng chính của bất kỳ ứng dụng cơ sở dữ liệu là việc kết nối nguồn dữ liệu và rút
trích dữ liệu chứa trong nguồn đó.
1.4.1. Chuỗi kết nối cơ sở dữ liệu
Là chuỗi chứa đựng thông tin ban đầu làm tham số cho trình cung cấp dữ liệu kết nối đến
nguồn dữ liệu. Mỗi trình cung cấp dữ liệu sẽ có chuỗi kết nối riêng.
1.4.1.1. Chuỗi kết nối SQL Server
Có dạng sau :
Data Source=<Tên SQL Server>; Initial Catalog=<Tên cơ sở dữ liệu>; Integrated
Security=True
Ví dụ :
Data Source=(local); Initial Catalog=TruongHoc; Integrated Security=True
1.4.1.2. Chuỗi kết nối OleDb
Có dạng sau :
Provider= Microsoft.Jet.OLEDB.4.0; Data Source=<đường dẫn đến cơ sở dữ liệu>; User
ID=<username>; Password=<mật khẩu>
Ví dụ:
Kết nối đến cơ sở dữ liệu MS Access
Provider=Microsoft.Jet.OLEDB.4.0;
ID=Admin; Password=;

Data

Source=d:\Northwind.mdb;

User


Kết nối đến cơ sở dữ liệu MS SQL Server
Provider=sqloledb; Data Source=MySqlServer;
Id=*****; Password=*****;

Initial

Catalog=pubs;

User

1.4.1.3. Chuỗi kết nối Oracle
Có dạng sau :
Data Source = ; User ID=<Tên username>; Password=<Mật khẩu>
Ví dụ:
8/114


Data Source=Oracle9i; User ID=*****; Password=*****;
1.4.2. Kết nối đến cơ sở dữ liệu
Sau khi đã thiết lập thông tin ban đầu trong chuỗi kết nối, tiếp theo chúng ta sử dụng đối
tượng Connection để thực thi việc kết nối vào cơ sở dữ liệu.
1.4.2.1. Kết nối cơ sở dữ liệu SQL Server
Sử dụng đoạn mã sau để thực hiện
string connectionString = “Data Source=(local); Initial Catalog=TruongHoc; Integrated
Security=True”;
SqlConnection connection = new SqlConnection(connectionString);
Connection.Open();
1.4.2.2. Kết nối cơ sở dữ liệu OLEDB
Sử dụng đoạn mã sau để thực hiện
string connectionString = “Provider=sqloledb; Data Source=MySqlServer; Initial

Catalog=pubs; User Id=*****; Password=*****; ”;
OleDbConnection connection = new OleDbConnection(connectionString);
connection.Open();
1.4.2.3. Kết nối cơ sở dữ liệu Oracle
Sử dụng đoạn mã sau để thực hiện
string connectionString =
“Data Source=Oracle9i;
User ID=*****;
Password=*****”;
OracleConnection connection = new OracleConnection(connectionString);
connection.Open();
1.4.3. Đối tượng Command và Parameter
1.4.3.1. Đối tượng Command
Mỗi trình cung cấp dữ liệu có đối tượng Command riêng phục vụ việc thực thi và trả kết
quả từ nguồn dữ liệu. Trình cung cấp dữ liệu SQL Server dùng đối tượng SqlCommand,
trình cung cấp dữ liệu OleDb dùng đối tượng OleDbCommand, trình cung cấp dữ liệu
Oracle dùng đối tượng OracleCommand và trình cung cấp dữ liệu Odbc dùng đối tượng
OdbcCommand.
Mỗi đối tượng Command kể trên sử dụng phương thức thực thi và trả về kết quả theo ý
muốn.
Bảng 1.4. Danh sách phương thức thực thi của đối tượng Command
9/114


Tên Command

Giá Trị Trả Về

ExecuteReader


Trả về đối tượng DataReader

ExecuteScalar

Trả về một giá trị tính toán

ExecuteNonQuery

Thực thi một lệnh nhưng không trả về kết quả

ExecuteXMLReader

Trả về đối tượng XMLReader. Chỉ có trong
đối tượng SqlCommand

Đoạn mã mẫu sử dụng đối tượng SqlCommand để thực thi truy cập bảng MONHOC
trong cơ sở dữ liệu TRUONGHOC
string connectionString = “Data Source=(local); Initial Catalog=TruongHoc; Integrated
Security=True”;
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "SELECT * FROM MONHOC";
command.CommandType = CommandType.Table;
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{

Console.WriteLine("{0}: {1}", reader[0], reader[1]);
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
1.4.3.2. Đối tượng Parameter
10/114


Đối tượng Command sử dụng Parameter để truyền giá trị đến câu lệnh SQL hay thủ tục
lưu trữ và các giá trị này sẽ được kiểm tra kiểu trước khi được truyền. Câu lệnh SQL có
tham số giúp cải thiện tốc độ thực thi do cơ sở dữ liệu sẽ tìm chính xác thông tin dữ liệu
mà người dùng cần.
Khi thêm tham số, ta phải cung cấp thuộc tính ParameterDirection để điều hướng giá trị
trả về của tham số đó.
Bảng 1.5. Danh sách các giá trị của tham số ParameterDirection

Tên Giá Trị

Mô Tả

Input

Mặc định. Tham số truyền giá trị đến câu lệnh SQL

InputOutput


Tham số truyền giá trị đến câu lệnh SQL và nhận kết
quả trả về từ câu lệnh SQL.

Output

Tham số chỉ nhận kết quả trả về từ câu lệnh SQL

ReturnValue

Tham số trả về 1 giá trị đơn nếu có tính toán trong câu
lệnh SQL (sử dụng hàm SUM, AVG…)

Cú pháp khai báo tham số tùy thuộc vào trình cung cấp dữ liệu. Bảng sau đây mô tả cách
khai báo tham số của những trình cung cấp dữ liệu đã trình bày ở trên
Bảng 1.6. Cú pháp khai báo tham số của các trình cung cấp dữ liệu

Trình cung cấp dữ liệu

Cú pháp đặt tên tham số

System.Data.SqlClient

Sử dụng @tên_tham_số

System.Data.OleDb

Sử dụng ?

System.Data.Odbc


Sử dụng ?

System.Data.OracleClient

Sử dụng :tên_tham_số

Bảng 1.7. Kiểu giá trị khi khai báo tham số
.NET
Framework type

SqlDb

OleDb

Odbc

Oracle

Type

Type

Type

Type

bool

Bit


Boolean

Bit

Byte

byte

TinyInt

UnsignedTinyInt

TinyInt

Byte

byte[]

VarBinary.

VarBinary

Binary

Raw

char

Không hỗ trợ


Char

Char

Byte

DateTime

DateTime

DBTimeStamp

DateTime

DateTime
11/114


DateTimeOffset

DateTimeOffset
chỉ có từ SQL
Server 2008 trở
về sau.

Decimal

Decimal

Decimal


Numeric

Number

double

Float

Double

Double

Double

float

Real

Single

Real

Float

Guid

UniqueIdentifier

Guid


UniqueIdentifier

Raw

Int16

SmallInt

SmallInt

SmallInt

Int16

Int32

Int

Int

Int

Int32

Int64

BigInt

BigInt


BigInt

Number

object

Variant

Variant

Không hỗ trợ

Blob

string

NVarChar

VarWChar

NVarChar

NVarChar

TimeSpan

Time chỉ có từ
SQL Server 2008
trở về sau.


DBTime

Time

DateTime

UInt16

Không hỗ trợ

UnsignedSmallInt

Int

UInt16

UInt32

Không hỗ trợ

UnsignedInt

BigInt

UInt32

UInt64

Không hỗ trợ


UnsignedBigInt

Numeric

Number

VarChar

VarChar

VarChar

VarChar

Char

Char

Char

Char

Money

Currency

Không hỗ trợ

Number


Date chỉ có từ
SQL Server 2008
trở về sau.

DBDate

Date

DateTime

Không hỗ trợ.

TinyInt

Không hỗ trợ

Sbyte

NChar

WChar

NChar

Nchar

Time chỉ có từ
SQL Server 2008
trở về sau


DBTime

Time

DateTime

Không hỗ trợ

VarNumeric

Không hỗ trợ

Number

Không hỗ trợ

Không hỗ trợ

DateTime

Đoạn mã sau sẽ thực hiện truy vấn tìm môn học Tin học A có mã môn học là THA
đã tồn tại trong cơ sở dữ liệu hay chưa?
SqlConnection connection = new SqlConnection(connectionString))
12/114


// Tạo đối tượng Command thực thi SQL.
SqlCommand command = new SqlCommand();
command.Connection = connection;

command.CommandText = "SELECT * FROM MONHOC WHERE MAMH =
@MAMH";
command.CommandType = CommandType.Text;
// Thêm tham số Input
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@MAMH";
parameter.SqlDbType = SqlDbType.SmallInt;
parameter.Direction = ParameterDirection.Input;
parameter.Value = “THA”;
// Thêm tham số vào tập tham số của đối tượng Command.
command.Parameters.Add(parameter);
// Mở kết nối và thực thi câu lệnh.
connection.Open();
SqlDataReader reader = command.ExecuteReader();
Đoạn mã viết bằng OLEDB
OleDbCommand command = new OleDbCommand("SELECT * FROM MONHOC
WHERE MAMH = ? ", connection);
command.CommandType = CommandType.Text;
OleDbParameter parameter = command.Parameters.Add("@MAMH",
OleDbType.Integer);
parameter.Direction = ParameterDirection.Input;
parameter.Value = "THA";
1.5. DISCONNECTED LAYER
Trong phần trước, chúng ta đã tìm hiểu về các đối tượng Connection kết nối cơ sở dữ
liệu, sau đó sử dụng đối tượng Command để thực hiện câu lệnh SQL và nhận kết quả trả
về từ cơ sở dữ liệu. Tuy nhiên, các thao tác này thực hiện kết nối liên tục đến cơ sở dữ
liệu. Vì vậy, phần này sẽ trình bày cách thức chúng ta xử lý dữ liệu sau khi đã ngắt kết
nối với 2 đối tượng DataAdapter và DataSet.
1.5.1. Đối tượng DataAdapter
Dùng để truy cập và đổ dữ liệu lưu thành bảng trong đối tượng DataSet. DataSet sẽ xử lý

dữ liệu các bảng mà nó lưu nhưng không ảnh hưởng đến cơ sở dữ liệu vật lý, sau đó nếu
muốn thay đổi thực sự tại cơ sở dữ liệu vật lý, đối tượng DataAdapter sẽ nhận nguồn dữ
liệu từ DataSet và cập nhật vào cơ sở dữ liệu.
13/114


Mỗi trình cung cấp dữ liệu có DataAdapter khác nhau như SqlDataAdapter dành cho
SQL Server, OleDbDataAdapter dành cho OLEDB, OdbcDataAdapter dành cho ODBC
hay OracleDataAdapter của Oracle.
DataAdapter là một bộ gồm bốn đối tượng Command:



SelectCommand : cho phép lấy thông tin từ nguồn dữ liệu về
InsertCommand : cho phép chèn thêm dữ liệu (dòng) vào bảng trong nguồn dữ
liệu.
• UpdateCommand : cho phép sửa đổi dữ liệu trên bảng trong nguồn dữ liệu.
• DeleteCommand : cho phép xóa dòng dữ liệu trên bảng trong nguồn dữ liệu.
Chúng ta cần phải chỉ rõ nội dung lệnh truy vấn cho SelectCommand, nội dung các đối
tượng còn lại có thể sử dụng đối tượng thích hợp để tự động phát sinh hoặc chỉ rõ lệnh
cho từng đối tượng.

1.5.1.1. Tạo đối tượng DataAdapter
Cũng như đối tượng Command, chúng ta cần khai báo rõ DataAdapter sử dụng theo trình
cung cấp dữ liệu nào.
Ví dụ tạo đối tượng DataAdapter cho loại nguồn dữ liệu SQL Server như sau :
Using System.Data.SqlClient.SqlDataAdapter
string conString = “…”;
SqlConnection conn = new SqlConnection(conString);
Conn.Open();

SqlDataAdapter boTichHopDuLieu = new SqlDataAdapter(“SELECT * FROM
MONHOC”, conn);
Lưu ý : DataAdapter chỉ thao tác được nguồn dữ liệu qua một đối tượng Connection đang
kết nối, nhưng có một điều đặc biệt là khi Connection chưa mở, DataAdapter sẽ tự động
mở kết nối khi cần thiết và tự động đóng lại.
1.5.1.2. Các chức năng của DataAdpater
a. Lấy dữ liệu từ nguồn
Sau khi có đối tượng DataAdpater với nội dung SelectCommand và thông tin về kết nối,
chúng ta có thể sử dụng DataAdapter để lấy dữ liệu về cho các đối tượng chứa dữ liệu
như DataSet, DataTable qua phương thức Fill.
- Đổ dữ liệu vào DataSet có sẵn. Dữ liệu được lấy về DataSet dưới dạng các DataTable,
với tên mặc định là Table, Table1, Table2, …
Fill(<dataset>)
14/114


- Đổ dữ liệu vào DataTable có sẵn
Fill(<datatable>)
- Đổ dữ liệu vào DataSet cho bảng <tên DataTable>; nếu chưa có, bảng sẽ được tạo.
Phương thức trả về số mẫu tin lấy về được.
Fill(<dataset>, <tên DataTable>)
b. Lấy cấu trúc dữ liệu từ nguồn
- Đổ cấu trúc dữ liệu vào DataSet có sẵn, phương thức trả về một tập hợp các bảng được
thêm vào DataSet.
FillSchema(<dataset>, <kiểu cấu trúc>)
- Đổ cấu trúc dữ liệu vào DataSet cho bảng <tên DataTable>; nếu chưa có, bảng sẽ được
tạo ra.
FillSchema(<dataset>, <kiểu cấu trúc>, <tên DataTable>)
<kiểu cấu trúc> quy định việc ánh xạ tên có được chấp nhận hay không
Bảng 1.8. Các giá trị của <kiểu cấu trúc>

Giá Trị

Mô Tả

SchemaType.Mapped

Sử dụng các TableMappings cho các cấu
trúc đưa vào DataSet nếu trùng hợp

SchemaType.Source

Không sử dụng các TableMappings

c. Tạo bộ lệnh cập nhật cho DataAdapter
Dựa vào nội dung lệnh truy xuất của DataAdapter, chúng ta có thể sử dụng một đối tượng
để tự động tạo các lệnh còn lại, đó là CommandBuilder.
Ví dụ :
Using System.Data.SqlClient.SqlCommandBuilder;
SqlDataAdapter myAdapter = new SqlDataAdapter(“SELECT * FROM MONHOC”,
conn);
SqlCommandBuilder comBuilder = new SqlCommandBuilder(myAdapter);
d. Cập nhật dữ liệu về nguồn
- Cập nhật các thay đổi trên <DataSet> vào nguồn dữ liệu
Update(<DataSet>)
<DataSet> : Đối tượng DataSet mà DataAdapter sẽ cập nhật
- Cập nhật các thay đổi trên bảng có DataTable vào nguồn dữ liệu
15/114


Update(<DataTable>)

<DataTable> : Đối tượng DataTable mà DataAdapter sẽ cập nhật
- Cập nhật các thay đổi trên bảng có tên <tên bảng> trong DataSet vào nguồn dữ liệu
Update(<DataSet>, <tên bảng>)
1.5.2. Đối tượng DataSet
Là bộ nhớ lưu trữ dữ liệu để xử lý theo mô hình lập trình quan hệ độc lập với nguồn dữ
liệu. DataSet biểu diễn đầy đủ dữ liệu của bảng, quan hệ giữa các bảng, ràng buộc toàn
vẹn.
Bảng 1.8. Các thuộc tính của DataSet
Thuộc Tính

Mô Tả

Relations

Tập hợp các quan hệ (DataRelation) một nhiều
theo mô hình cơ sở dữ liệu quan hệ của DataSet

Tables

Tập hợp các bảng (DataTable) của DataSet (chỉ
đọc)

Các phương thức của DataSet
a. Thêm bảng vào DataSet
Muốn đưa một DataTable vào DataSet, chúng ta dùng phương thức Add của tập hợp
Tables
- Thêm một bảng mới với tên là <tên bảng>, đưa vào tập hợp Tables
Tables.Add(<tên bảng>)
- Đưa <bảng> vào tập hợp Tables
Tables.Add(<bảng>)

<bảng> là một đối tượng DataTable được đưa vào DataSet
Lưu ý: Tên bảng trong DataSet có phân biệt chữ hoa chữ thường. Hai bảng tên “hocsinh”
và “Hocsinh” là hai bảng khác nhau.
Ví dụ :
DataSet CSDL = new DataSet(“QLHocSinh”);
DataTable tblMonHoc = new DataTable(“MonHoc”);
CSDL.Tables.Add(tblMonHoc);
b. Xóa bảng ra khỏi tập hợp Tables của DataSet
Các phương thức sau dùng để xóa bảng ra khỏi tập hợp Tables
- Xóa <bảng> khỏi tập hợp Tables
16/114


Tables.Remove(<bảng>);
- Xóa bảng có tên <tên bảng> khỏi tập hợp Tables
Tables.Remove(<tên bảng>);
- Xóa bảng có chỉ số là <chỉ số> khỏi tập hợp Tables
Tables.RemoveAt(<chỉ số>);
- Xóa tất cả các bảng khỏi DataSet
Tables.Clear();
c. Kiểm tra bảng có thuộc về DataSet
- Trả về True nếu trong Tables có bảng tên <tên_bảng>, ngược lại trả về False.
Tables.Contains(<tên bảng>);
- Xóa bỏ mọi dữ liệu trên DataSet
Tables.Clear();
- Hủy DataSet
Gọi phương thức Dispose để giải phóng mọi tài nguyên trên vùng nhớ DataSet đang sử
dụng.
Dispose()
1.5.3. Đối tượng DataTable

Dữ liệu các bảng trong nguồn dữ liệu được lấy về và đưa vào các DataTable. DataTable
thuộc tên miền:
Using System.Data.DataTable;
Ví dụ cách tạo một DataTable
DataTable bang = new DataTable(<tên bảng>);
DataTable hình thành từ các DataColumn, DataRow
Bảng 1.9. Các thuộc tính của DataTable
Thuộc Tính

Mô Tả

ChildRelations

Trả về tập hợp những quan hệ trong đó bảng
đóng vai trò bảng cha

Columns

Trả về tập hợp các cột trong bảng

Constrains

Trả về tập hợp các ràng buộc trong bảng

DataSet

Trả về DataSet chứa bảng

DefaultView


Trả về DataView phát sinh từ bảng
17/114


ParentRelations

Trả về tập hợp những quan hệ trong đó bảng
đóng vai trò bảng con

PrimaryKey

Mảng các cột có chức năng làm khóa chính của
bảng

Rows

Trả về tập hợp các dòng dữ liệu của bảng

TableName

Tên của DataTable

1.5.3.1. Tập hợp Rows
Rows là tập hợp các dòng dữ liệu của bảng. Mọi tham chiếu đến dòng đều thông qua tập
hợp này.
- Lấy số dòng trong tập hợp : cho biết số dòng dữ liệu trong tập hợp
Rows.Count
- Tham chiếu đến dòng trong tập hợp
Rows.Item[<Chỉ số dòng>]
- Truy xuất giá trị của ô

Rows.Item[<Chỉ số dòng>][<Chỉ số cột>]
Hoặc
Rows[<Chỉ số dòng>][<tên cột>]
- Thêm dòng mới vào bảng
Thêm một dòng có sẵn vào bảng. Dòng này được tạo ra từ phương thức NewRow của đối
tượng DataTable
DataTable bang = new DataTable();
DataRow dongMoi = bang.NewRow();
dongMoi[“MAMH”] = textMAMH;
dongMoi[“TENMH”] = textTENMH;
bang.Rows.Add(dongMoi);
- Xóa bỏ dòng trên bảng
Rows.RemoveAt(<Chỉ số dòng>)
- Xóa toàn bộ các dòng dữ liệu của bảng
Rows.Clear();
1.5.3.2. Tập hợp Columns
18/114


Columns là tập hợp chứa các cột trong cấu trúc của bảng. Mọi tham chiếu đến cột đều
thông qua tập hợp này.
- Lấy số cột trong tập hợp: cho biết số cột có trong tập hợp
Columns.Count
- Tham chiếu đến cột trong tập hợp
Columns.Item[<tên cột>]
Hoặc
Columns[<tên cột>]
Columns[<chỉ số cột>]
1.6. ĐỐI TƯỢNG DỮ LIỆU SQLDATASOURCE
Đối tượng SqlDataSource lấy dữ liệu từ cơ sở dữ liệu SQL và đổ vào các điều khiển có

hỗ trợ hiển thị dữ liệu (TextBox, GridView …). Ngoài ra, SqlDataSource còn cho phép
cập nhật hay sắp xếp dữ liệu trên Web mà không phải viết mã lệnh quá nhiều.
a. Khai báo đối tượng SqlDataSource
<asp:SqlDataSource id=”SqlDataSource1” runat=”server”/>
b. Truy cập dữ liệu
Để truy cập dữ liệu từ cơ sở dữ liệu sử dụng SqlDataSource, ta cần thực hiện thiết lập giá
trị cho các thuộc tính quan trọng sau :
-

-

ProviderName : Tên trình cung cấp dữ liệu ADO.NET mà ta đang làm việc (SQL
Server, OLEDB, ODBC, Oracle). Ở đây, ta sử dụng Microsoft SQL Server nên
ProviderName là “System.Data.SqlClient”.
ConnectionString : Chuỗi kết nối đến cơ sở dữ liệu cần làm việc.
SelectCommand : Thiết lập câu truy vấn SQL dạng SELECT

Lưu ý : Việc thiết lập chuỗi kết nối cụ thể cho thuộc tính ConnectionString không được
khuyến khích sử dụng đối với những dự án Web lớn. Để ứng dụng Web dễ bảo trì và bảo
mật, chuỗi kết nối sẽ được lưu vào thẻ <connectionString> trong tập tin Web.config. Sau
đó, trong đối tượng SqlDataSource, ta sử dụng đối tượng ConnectionString để gọi chuỗi
kết nối từ Web.config.
Ví dụ :
ID="SqlDataSource1"
runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT * FROM [Categories]">
19/114



</asp:SqlDataSource>
c. Hiển thị dữ liệu đến các điều khiển
Như đã biết, điều khiển SqlDataSource chỉ làm nhiệm vụ thực hiện các truy vấn và nhận
kết quả trả về từ nguồn dữ liệu. Việc hiển thị dành cho các điều khiển khác. Đoạn mã sau
minh họa cách đổ dữ liệu từ SqlDataSource đến điều khiển ListBox
<%@ Page language="C#" %>
" />
1.0

Transitional//EN"

<html xmlns=" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
id="ListBox1"
runat="server"
DataTextField="LastName"

DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
d. Sử dụng tham số với SqlDataSource
Tên tham số trong các câu lệnh SelectCommand, InsertCommand, UpdateCommand,
DeleteCommand trong SqlDataSource nếu dùng nguồn dữ liệu SQL Server luôn bắt đầu
bằng dấu “@”, trong khi đó nguồn OLEDB và ODBC dùng dấu “?”.
20/114


Ví dụ :
SelectCommand="SELECT EmployeeID, LastName, FirstName FROM
Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName)
VALUES
(@LastName,
@FirstName);
SELECT
@EmpID
=
SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName,
FirstName=@FirstName WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted" RunAt="server">
<SelectParameters>

<asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter Name="FirstName" Type="String" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name=”EmpID” Type=”Int32” />
<asp:Parameter Name=”LastName” Type=”String” />
<asp:Parameter Name=”FirstName” Type=”String” />
</UpdateParameters>
</asp:sqlDataSource>
CÂU HỎI ÔN TẬP BÀI 1
1. Trình bày chi tiết các thành phần của ADO.NET.
2. Trình bày chức năng của các trình cung cấp dữ liệu trong ADO.NET
3. Trình bày cách gọi namespace của các trình cung cấp dữ liệu trong ADO.NET.
4. Trình bày sự ưu điểm kết nối dữ liệu giữa SQL Server với OLEDB.
5. Trình bày chức năng của đối tượng kết nối dữ liệu (Connection).
21/114


6. Trình bày chức năng của đối tượng Command.
7. Trình bày chức năng của đối tượng DataAdapter
8. Trình bày chức năng của đối tượng DataSet
9. Trình bày chức năng của đối tượng DataTable

22/114


THỰC HÀNH BÀI 1

Bài 1 : Bài thực hành này hướng dẫn học sinh cách viết mã lệnh tạo đối tượng kết
nối đến cơ sở dữ liệu MS SQL Server
Bước 1. Mở chương trình Visual Studio, chọn File  New  Project

Hình 1.3. Tạo dự án ASP.NET Web Application
Bước 2 : Mở file Web.config , tìm thẻ <appSetting/> và chèn cặp thẻ sau :
<connectionStrings>

</connectionStrings>
Bước 3 : Mở file Default.aspx theo dạng Design, lần lượt chèn các Control vào khung
thiết kế
Bảng 1.10. Các control tham gia thiết kế
Tên Control

ID

Label

lblServerVersion

Label

lblStatus

Text

23/114



Bước 4 : Mở file Default.aspx.cs, nhập mã lệnh vào phương thức Page_Load
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Web.Configuration;
namespace TestConnection
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Bước 1 : lấy chuỗi kết nối CSDL TruongHoc
string conStr =
WebConfigurationManager.ConnectionStrings["TruongHoc"].ConnectionString;
//Bước 2 : Tạo đối tượng kết nối
SqlConnection con = new SqlConnection(conStr);
try
{
con.Open();
lblServerVersion.Text = "MS SQL Server Version : " + con.ServerVersion;
lblStatus.Text = "Connection Status : " + con.State.ToString();
}
catch (SqlException sqle)
{
lblError.Text = "Error message : " + sqle.Message;

}
finally {
con.Close();
lblStatus.Text += "
<b> Now Connection Is : </b>";
24/114


lblStatus.Text += con.State.ToString();
}
}
}
}
Bước 5 : Nhấn Ctrl + F5 chạy chương trình
Bài 2 : Bài thực hành này hướng dẫn học sinh cách viết mã lệnh lấy dữ liệu và xuất
kết quả ra trang Web sử dụng các đối tượng sau :
-

SqlConnection
SqlCommand
SqlDataReader

Bước 1 : Mở chương trình Visual Studio, chọn File  New  Project

Hình 1.4. Tạo dự án ASP.NET Web Application
Bước 2 : Mở file Web.config , tìm thẻ <appSetting/> và chèn cặp thẻ sau ngay bên
dưới:
<connectionStrings>

</connectionStrings>

25/114


×