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

Bài giảng Lập trình C: Phần 2 ĐH Phạm Văn Đồng

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 (812.52 KB, 48 trang )

Chương 4:
Quản lý dữ liệu với Microsoft SQL Server
Thời lượng: 8 tiết
Mục tiêu:
- Hiểu được các đối tượng trong hệ quản trị CSDL Microsoft SQL Server,
- Viết được các câu lệnh SQL theo yêu cầu,
- Tạo, quản lý được một CSDL trong Microsoft SQL Server theo yêu cầu.
4.1. Các khái niệm về cơ sở dữ liệu trong MS SQL Server
4.1.1. Các khái niệm về cơ sở dữ liệu
a) Cơ sở dữ liệu:
Một cơ sở dữ liệu (CSDL - Database) là một <tập hợp các dữ liệu> liên quan với nhau> được lưu trữ trong máy tính theo một quy định nhất định
nhằm phục vụ cho <một mục đích quản lý> nào đó.
Ví dụ: CSDL phục vụ cho việc quản lý các chuyến bay của một hãng
hàng không cung cấp các thông tin vế số hiệu chuyến bay, nơi xuất phát, nơi
đến, số chỗ ngồi, ngày bay của tất cả các chuyến bay trong năm; CSDL phục vụ
cho công tác quản lý đào tạo trong trường chứa các dữ liệu phản ánh thông tin
về học sinh, giáo viên, môn học, phòng học,...
b) Hệ quản trị cơ sở dữ liệu:
Một hệ quản trị cơ sở dữ liệu (HQT CSDL - Database Management
System) là phần mềm cho phép người dùng <tạo, lưu trữ> và <quản lý> cơ sở
dữ liệu. Đồng thời HQT CSDL cung cấp một môi trường thuận lợi cho việc
<khai thác> thông tin được lưu trữ trong cơ sở dữ liệu.
Một số hệ quản trị cơ sở dữ liệu: Microsoft (MS) Visual Foxpro, MS
Access, MS SQL Server, DB2, Oracle,...
c) Hệ cơ sở dữ liệu:
Một hệ cơ sở dữ liệu (Database System) là một hệ thống phần mềm nhằm
quản lý CSDL của một hệ thống thông tin cụ thể nào đó.
Như vậy các thành phần bên trong một hệ CSDL gồm có: chương trình,
CSDL, HQT CSDL. Để vận hành hệ CSDL cần có một số lượng con người.
d) Mô hình dữ liệu:


Nền tảng của cấu trúc cơ sở dữ liệu là mô hình dữ liệu. Mô hình dữ liệu
Trang 56


được định nghĩa là một sưu tập các công cụ khái niệm dùng cho việc mô tả dữ
liệu, các mối quan hệ dữ liệu, các ngữ nghĩa dữ liệu và các ràng buộc dữ liệu.
Các mô hình dữ liệu phổ biến là: mạng, phân cấp, quan hệ, ER, hướng đối
tượng.
e) Mô hình dữ liệu quan hệ:
Mô hình dữ liệu quan hệ là mô hình dữ liệu trong đó tất cả dữ liệu được tổ
chức trong các bảng (Table) có mối quan hệ với nhau. Mỗi bảng bao gồm các
cột (Field – trường, thuộc tính), các dòng (Record – bản ghi, bộ).
4.1.2. Khái niệm về cơ sở dữ liệu trong MS SQL Server
MS SQL Server là HQT CSDL được phát triển để tạo và quản lý CSDL
quan hệ. Một CSDL trong MS SQL Server chứa các đối tượng: Tables, Views,
Procedures,… Tables trong MS SQL Server gồm các Table có quan hệ với nhau.
Sau đây sẽ trình bày các khái niệm liên quan đến Tables.
a) Bảng (Table):
Bảng bao gồm:
- Tên của bảng: xác định duy nhất;
- Cấu trúc của bảng: tập hợp các cột;
- Dữ liệu của bảng: tập hợp các dòng;
b) Khóa chính của bảng (Primary Key):
Mỗi bảng phải có một cột (hoặc tập các cột) mà giá trị của nó xác định
duy nhất định duy nhất một dòng trong tập hợp các dòng của bảng. Cột đó (tập
các cột đó) được chọn làm khóa chính.
c) Mối quan hệ (Relationship):
Mối quan hệ của bảng được thể hiện thông qua sự ràng buộc giá trị dữ
liệu xuất hiện trong bảng này phải có xuất hiện trong bảng kia. MS SQL Server
chỉ hỗ trợ mối quan hệ 1-1 và 1-n.

d) Khóa ngoài (Foreign Key):
Một cột (hoặc một tập các cột) trong một bảng mà giá trị của nó được xác
định từ khóa chính của một bảng khác được gọi là khóa ngoài.
4.2. Ngôn ngữ SQL
SQL (Structured Query Language) là ngôn ngữ được sử dụng cho các
HQT CSDL. Ngôn ngữ SQL chuẩn được đưa ra bởi ANSI (Amerrican National
Standards Institude) và ISO (International Standards Organnization) với phiên
bản mới nhất hiện nay là phiên bản SQL-92 (phiên bản được đưa ra vào năm
1992). Mặc dù có nhiều ngôn ngữ khác nhau được đưa ra cho các HQT CSDL
Trang 57


quan hệ, SQL vẫn là ngôn ngữ được sử dụng rộng rãi hiện nay trong nhiều hệ
thống CSDL thương mại như: Oracle, SQL Server, DB2, Microsoft Access, …
Thông qua SQL, người sử dụng có thể dễ dàng định nghĩa được dữ liệu, thao tác
với dữ liệu, … Mặt khác, đây là ngôn ngữ có tính khai báo nên nó dễ sử dụng và
cũng vì vậy mà trở nên phổ biến.
4.2.1. Các câu lệnh SQL
Câu lệnh

Chức năng

a) Thao tác dữ liệu
SELECT

Truy xuất dữ liệu

INSERT

Bổ sung dữ liệu


UPDATE

Cập nhật dữ liệu

DELETE

Xóa dữ liệu

TRUNCATE

Xóa toàn bộ dữ liệu trong bảng

b) Định nghĩa dữ liệu
CREATE TABLE

Tạo bảng

DROP TABLE

Xóa bảng

ALTER TABLE

Sửa cấu trúc bảng

CREATE FUNCTION Tạo hàm (do người sử dụng định nghĩa)
ALTER FUNCTION

Sửa đổi hàm


DROP FUNCTION

Xóa hàm

CREATE TRIGGER

Tạo trigger

ALTER TRIGGER

Sửa trigger

DROP TRIGGER

Xóa trigger

4.2.2. Kiểu dữ liệu

Trang 58


Tên kiểu

Mô tả

CHAR (n)

Kiểu chuỗi với độ dài cố định


NCHAR (n)

Kiếu chuỗi với độ dài cố định hỗ trợ UNICODE

VARCHAR (n)

Kiểu chuỗi với độ dài chính xác

NVARCHAR (n)

Kiểu chuỗi với độ dài chính xác hỗ trợ UNICODE

INTEGER

Số nguyên có giá trị từ -231 đến 231 - 1

INT

Như kiểu Integer

TINYTINT

Số nguyên có giá trị từ 0 đến 255

SMALLINT

Số nguyên có giá trị từ -215 đến 215 – 1

BIGINT


Số nguyên có giá trị từ -263 đến 263 – 1

NUMERIC (p,s)

Kiểu số với độ chính xác cố định

DECIMAL (p,s)

Tương tự kiểu Numeric

FLOAT

Số thực có giá trị từ -1.79E+308 đến 1.79E+308

REAL

Số thực có giá trị từ -3.40E + 38 đến 3.40E + 38

MONEY

Kiểu tiền tệ

BIT

Kiểu bit (có giá trị 0 hoặc 1)

DATETIME

Kiểu ngày giờ (chính xác đến phần trăm của giây)


SMALLDATETIME

Kiểu ngày giờ (chính xác đến phút)

BINARY

Dữ liệu nhị phân với độ dài cố định (tối đa 8000
bytes)

VARBINARY

Dữ liệu nhị phân với độ dài chính xác (tối đa 8000
bytes)

IMAGE

Dữ liệu nhị phân với độ dài chính xác (<=
Trang 59


2,147,483,647 bytes)
TEXT

Dữ liệu kiếu chuỗi với độ dài lớn (tối đa
2,147,483,647 ký tự)

NTEXT

Dữ liệu kiếu chuỗi với độ dài lớn và hỗ trợ
UNICODE (tối đa 1,073,741,823 ký tự)


4.2.3. Toán tử
Toán tử

Ý nghĩa

a) Logic:
AND / OR

Và / Hoặc

b) So sánh:
=

Bằng

>

Lớn hơn

<

Nhỏ hơn

>=

Lớn hơn hoặc bằng

<


Nhỏ hơn hoặc bằng

<>

Khác

!>

Không lớn hơn

!<

Không nhỏ hơn

c) Danh sách:
IN

Nằm trong danh sách

NOT IN

Không nằm trong danh sách

d) Giới hạn dữ liệu:
BETWEEN

Giá trị BETWEEN a AND b nghĩa là (a ≤ Giá trị ≤ b)

Trang 60



NOT BETWEEN

Giá trị NOT BETWEEN a AND b nghĩa là (Giá_trị <
a) AND (Giá trị > b)

LIKE

Mô tả khuôn dạng dữ liệu cần tìm kiếm có sử dụng ký
tự đại diện:
%

: Chuỗi ký tự bất kỳ

_

: Một ký tự bất kỳ

[]

: Ký tự bất kỳ trong giới hạn được chỉ định

[^] : Ký tự bất kỳ không nằm trong giới hạn được chỉ
định
4.2.4. Một số hàm thường dùng
Công dụng

Tên hàm
a) Ngày (Date: ngày/tháng/năm):
GetDate()


Lấy ngày hiện tại

Day(Date)

Lấy ngày trong tháng của một ngày

Month(Date)

Lấy tháng trong năm của một ngày

Year(Date)

Lấy năm của một ngày

b) Chuỗi (string: chuỗi; m, n: độ dài):
Left(string, n)

Trích từ chuỗi string n ký tự từ trái sang

Right(string, n)

Trích từ chuỗi string n ký tự từ phải sang

Substring(string, m, n)

Trích từ chuỗi string n ký tự từ vị trí m

Ltrim(string)


Cắt bỏ khoảng trắng thừa bên trái chuỗi string

Rtrim(string)

Cắt bỏ khoảng trắng thừa bên phải chuỗi string

Len(string)

Độ dài chuỗi string

Trang 61


4.2.5. Các câu lệnh SQL thường dùng
Để thuận tiện cho việc minh họa các lệnh SQL, bài giảng đưa ra CSDL
mẫu như Hình 4-1:
LOP

SINHVIEN

# malop

# masv

tenlop

tensv

tengvcn


ngaysinh

magvcn

quequan
malop

Hình 4-1 Mô hình dữ liệu mẫu

a) Câu lệnh Insert:
Cú pháp:
INSERT INTO <tên bảng>
VALUES (danh sách giá trị)

Ví dụ: Bổ sung thêm một sinh viên vào bảng SINHVIEN:
INSERT INTO [SINHVIEN]
VALUES („SV010‟, ‟Nguyễn Văn A‟, ‟12/02/1992‟, ‟Sơn
Tịnh‟, ‟L1001‟)

Trong trường hợp chỉ bổ sung dữ liệu cho một số trường, ta phải chỉ định
tên trường sau tên bảng:
INSERT INTO <tên bảng>(danh sách trường)
VALUES (danh sách giá trị)

Ví dụ: Bổ sung thêm một sinh viên vào bảng SINHVIEN:
INSERT INTO [SINHVIEN]([masv], [tensv],
[ngaysinh],[quequan])
VALUES („SV011‟,‟Trần Thanh B‟,‟22/11/1992‟,‟Sơn Hà‟)

b) Câu lệnh Update:

Cú pháp:
UPDATE <tên bảng cập nhật>
SET

<tên cột 1> = <biểu thức 1>
Trang 62


[,…,<tên cột n> = <biểu thức n>]
[FROM <danh sách bảng>]
[WHERE <điều kiện>]

Ví dụ: Sửa lại quê quán của sinh viên có mã là “SV011” thành “Bình
Sơn”:
UPDATE [SINHVIEN]
SET [quequan]=‟Bình Sơn‟
WHERE [masv]=‟SV011‟

c) Câu lệnh Delete:
Cú pháp:
DELETE FROM <tên bảng>
[FROM <danh sách bảng>]
[WHERE <điều kiện>]

Ví dụ: Xóa các sinh viên có mã là “SV011”:
DELETE FROM [SINHVIEN]
WHERE ([masv]=‟SV011‟)

d) Câu lệnh Select:
Cú pháp:

SELECT <danh sách trường>
FROM <danh sách bảng>
[WHERE <điều kiện>]
[GROUP BY <danh sách trường kết quả>
[HAVING <điều kiện>]]
[ORDER BY <danh sách trường kết quả >]

Trong đó:
- Mệnh đề SELECT: danh sách trường gồm: tên các trường trong các
bảng trong mệnh đề FROM, tên các trường mới, … Giá trị của trường mới có
thể được tạo thành bằng các biểu thức, hàm được xây dựng sẵn.
- Mệnh đề FROM: danh sách các bảng là tên các bảng. Có thể dùng bí
danh (As) cho bảng.
- Mệnh đề WHERE: điều kiện lọc
- Mệnh đề GROUP BY: dùng để nhóm các bảng ghi theo một số trường
nào đó. Kết quả có thể được lọc bởi mệnh đề HAVING BY.
Trang 63


- Mệnh đề ORDER BY: sắp xếp kết quả theo các trường
Ví dụ: Câu lệnh lấy danh sách magv, tengv của các giáo viên:
SELECT [magv],[tengv]
FROM [GIAOVIEN]

Ví dụ: Câu lệnh lấy danh sách magv, tengv, ngaysinh, trinhdo của các
giáo viên:
SELECT *
FROM [GIAOVIEN]

Ví dụ: Câu lệnh lấy danh sách masv, tensv, ngaysinh, quequan, tenlop của

các sinh viên:
SELECT [masv], [tensv], [tensv],
[ngaysinh],[quequan], [tenlop]
FROM ([LOP] INNER JOIN [SINHVIEN] ON [LOP].[malop]
=[SINHVIEN].[malop])

Ví dụ: Câu lệnh lấy danh sách masv, tensv của các sinh viên có quê quán
tại “Sơn Tịnh”:
SELECT [masv],[tensv]
FROM [LOP]
WHERE ([quequan]=‟Sơn Tịnh‟)

Ví dụ: Câu lệnh lấy danh sách masv, tensv của các sinh viên sinh năm
1994 và có quê ở “Sơn Hà”:
SELECT [masv],[tensv]
FROM [SINHVIEN]
WHERE (Year([ngaysinh])=1994)And([quequan]=‟Sơn
Hà‟)

Ví dụ: Câu lệnh lấy danh sách tenlop, “số sinh viên của lớp” của tất cả các
lớp sắp xếp theo tên lớp:
SELECT [tenlop],count([masv]) As CountOfmasv
FROM [LOP] INNER JOIN [SINHVIEN] ON
[LOP].[malop]=[SINHVIEN].[malop]
GROUP BY [tenlop]
ORDER BY [tenlop]

Ví dụ: Câu lệnh lấy danh sách malop, tenlop, “số sinh viên của lớp” của
các lớp có sĩ số lớn hơn 19:
Trang 64



SELECT [malop],[tenlop],count([masv]) As
CountOfmasv
FROM [LOP] INNER JOIN [SINHVIEN] ON
[LOP].[malop]=[SINHVIEN].[malop]
GROUP BY [LOP].[malop],[tenlop]
HAVING (count([masv])>19)

4.3. Câu hỏi và bài tập
1) Tạo CSDL trên Server.
2) Viết các câu lệnh SQL phục vụ cho việc quản lý bảng LOP.
3) Viết các câu lệnh SQL phục vụ cho việc quản lý bảng SINHVIEN.
4) Viết các thủ tục lưu trữ phục vụ cho việc quản lý bảng LOP.
5) Viết các thủ tục lưu trữ phục vụ cho việc quản lý bảng SINHVIEN.
6) Viết các lệnh SQL nhằm:
- Kiểm tra sự tồn tại của một CSDL đã có trên MS SQL Server.
- Thêm Một CSDL mới.
- Thêm các bảng LOP, SINHVIEN và các quan hệ lên CSDL.
7) Hãy cho biết các lợi ích của thủ tục lưu trữ.
4.4. Bài mẫu
Thiết kế CSDL, nhập dữ liệu và viết khung nhìn, hàm chức năng theo yêu
cầu sau:
- Tạo CSDL có tên là QLSV với thiết kế như sau:

Trang 65


- Nhập dữ liệu:


- Tạo khung nhìn có tên là View_TKGT để thống kê số lượng sinh viên
của các lớp theo giới tính:
CREATE VIEW View_TKGT AS
SELECT malop, SUM(CASE gioitinh WHEN 1 THEN 1 ELSE 0 END) AS
„Nam‟, SUM(CASE gioitinh WHEN 0 THEN 1 ELSE 0 END) AS „Nữ‟
FROM SINHVIEN
GROUP BY malop
Go

- Tạo hàm người dùng có tên là Fun_LayTT để lấy thông tin của một sinh
viên phục vụ cho việc in giấy xác nhận phục vụ mục đích tạm hoãn nghĩa vụ
quân sự với tham số vào là mã sinh viên và với các tham số ra là họ tên, ngày
sinh, giới tính, lớp, khoa, năm học hiện tại, năm bắt đầu, năm kết thúc khóa học.
CREATE FUNCTION Fun_LayTT (@masv nvarchar(12))
RETURNS TABLE
AS
RETURN
Select hodem+' '+ten As hotensv,ngaysinh,case gioitinh when
1 then 'Nam' else N'Nữ' end As phai, LOP.malop, tenkhoa,namht,
khoa,khoa+sonam As namkt from LOP Inner Join SINHVIEN on
Lop.malop=SINHVIEN.malop Where masv=@masv
Go

Trang 66


Chương 5:
Truy cập cơ sở dữ liệu với ADO.NET
Thời lượng: 12 tiết
Mục tiêu:

- Hiểu vai trò, chức năng của các đối tượng hỗ trợ truy cập CSDL,
- Hiểu được cách truy cập dữ liệu với đối tượng Command,
- Hiểu được cách truy cập dữ liệu với mô hình CSDL ảo,
- Buộc được dữ liệu đơn giản, phức tạp,
- Viết được chương trình truy cập CSDL đơn giản.
5.1. Mô hình kết nối và truy cập dữ liệu với ADO.NET
5.1.1. Mô hình kết nối và truy cập dữ liệu tổng quát
Hình 5-1 mô tả đơn giản kiến trúc tổng quát của ADO.NET. Các đối
tượng trong kiến trúc này đều thuộc không gian tên System.Data. Sau đây là ý
nghĩa của các đối tượng:
Tên đối tượng

Ý nghĩa

Connection

để kết nối đến một CSDL

Transaction

hỗ trợ giao tác trong truy cập dữ liệu

Command

thực hiện các câu lệnh SQL

DeleteCommand

thực hiện câu lệnh xóa


UpdateCommand

thực hiện câu lệnh sửa

InsertCommand

thực hiện câu lệnh chèn

SelectCommand

thực hiện câu lệnh lấy dữ liệu

DataReader

đọc dữ liệu từng dòng một

DataAdapter

hỗ trợ DataSet đồng bộ dữ liệu với
CSDL qua các câu lệnh SQL

DataSet

CSDL ảo trên ứng dụng

DataTable

bảng trong DataSet
Trang 67



Database

Tabl
e

Connection

Transaction

Application

Command

DeleteCommand
UpdateCommand
InsertCommand
SelectCommand
DataReader
DataAdapter
Command

DataSet
DataTable

Hình 5-1 Mô hình truy cập dữ liệu tổng quát trong ADO.NET

5.1.2. Connection
Để kết nối đến một CSDL ta sử dụng đối tượng Connection. Đối với mỗi
loại CSDL, .NET thiết kế một lớp Connection cụ thể. Chẳng hạn, với CSDL MS

SQL Server thì có SqlConnection thuộc không gian tên System.Data.SqlClient,
với CSDL MS Access thì có OleDbConnection thuộc không gian tên
System.Data.OleDb,… Như Connection, các lớp Command, Transaction,
DataReader, DataAdapter cũng được thiết kế tương tự cho các loại CSDL. Sau
đây là một số thuộc tính, phương thức của lớp Connecttion.
Ý nghĩa

Tên
ConnectionString

tên chuỗi kết nối. Một chuỗi kết nối có các thông tin: tên
HQT CSDL, tên máy chủ, tên CSDL, tên đăng nhập, mật
Trang 68


khẩu,… Có một số điều khiển dữ liệu giúp ta có được
ConnectionString một cách chính xác.
State

trạng thái của kết nối

Close()

đóng kết nối

Open()

mở kết nối

5.1.3. Kết nối đến cơ sở dữ liệu

Việc kết nối đến CSDL dựa trên mô hình Client - Server. CSDL được trên
Server và chương trình ứng dụng được đặt ở máy người dùng (Client). Quy trình
để một Client kết nối đến Server được thực hiện theo các bước sau:
- Client gửi chuỗi kết nối chứa các thông tin về Client và CSDL muốn kết
nối đến Server.
- Server kiểm tra thông tin:
+ Nếu hợp lệ thì cho phép Client quyền truy cập CSDL tương ứng.
Việc truy cập cũng được thực hiện bằng các câu lệnh SQL.
+ Nếu không hợp lệ thì không cấp quyền truy cập.
Để truy cập đến một CSDL ta thực hiện theo các bước:
Bước 1: tạo đối tượng Connection
- Xác định chuỗi kết nối đến CSDL cần truy cập. Giả sử biến được đặt tên
là ChuoiKetNoi.
ChuoiKetNoi = @"Data Source=XP-VANTOAN\SQLEXPRESS;Initial
Catalog=QLSV;Integrated Security=True";
- Tạo đối tượng Connection. Giả sử biến được đặt tên là KN. Như vậy, ta
có thể tạo đối tượng Connection như sau.
SqlConnection KN = new SqlConnection(ChuoiKetNoi);

Bước 2: truy cập dữ liệu
Để truy cập dữ liệu với CSDL MS SQL Server ta thực hiện theo trình tự:
- Mở kết nối:
KN.Open();

- Thực hiện các câu lệnh SQL.
- Đóng kết nối:
KN.Close();
Trang 69



Để kiểm tra kết nối có thành công hay không, ta có thể xây dựng phương
thức KiemTraKN như sau:
Public static bool KiemTraKN()
{
try
{
KN.Open();
KN.Close();
return true;
}
catch
{
return false;
}
}

Phương thức KiemTraKN() sẽ trả về true khi kết nối thành công, ngược
lại thì kết nối không thành công.
Người ta thường xây dựng thuộc tính Connection để lấy đối tượng
Connection cụ thể làm nhiệm vụ kết nối. Trong các thao tác cập nhật dữ liệu, đối
tượng làm nhiệm vụ kết nối được sử dụng thường xuyên nên thuộc tính này là
rất hữu ích.
5.1.4. Transaction
Là lớp hỗ trợ quản lý theo giao tác trong việc cập nhật dữ liệu. Nếu không
sử dụng giao tác, một thao tác cập nhật (thêm, xóa, sửa) sẽ làm thay đổi dữ liệu
thật sự. Còn khi sử dụng giao tác, ta có thể sử dụng một số thao tác cập nhật dữ
liệu thì dữ liệu cũng thay đổi nhưng chưa có hiệu lực thực sự cho đến chấp nhận
hoặc hủy bỏ giao tác. Nếu chập nhận giao tác thì các thao tác cập nhật dữ liệu
trong giao tác đó sẽ có hiệu lực, còn nếu hủy bỏ giao tác thì các thao tác cập
nhật dữ liệu trong giao tác đó không có hiệu lực.

Việc sử dụng giao tác trong việc cập nhật dữ liệu là cần thiết trong các
trường hợp liên quan đến những dữ liệu quan trọng.
Trình tự thực hiện cập nhật dữ liệu theo giao tác trải qua các bước:
Bước 1: bắt đầu một giao tác
- Sử dụng đối tượng Connection hiện tại:
Trang 70


Connection.Open();
SqlTransaction gt = Connection.BeginTransaction();

Bước 2: thực hiện cập nhật dữ liệu
Thực hiện các thao tác cập nhật dữ liệu
Bước 3: chấp nhận hoặc hủy bỏ giao tác
- Nếu chấp nhận giao tác, ta thực hiện:
gt.Commit();
Connection.Close();

- Nếu hủy bỏ giao tác, ta thực hiện:
gt.Rollback();
Connection.Close();

5.2. Mô hình truy cập dữ liệu với Command
Đối với mô hình này, việc cập nhật dữ liệu được thực hiện thông qua đối
tượng Command, việc đọc dữ liệu thông qua đối tượng DataReader kết hợp với
đối tượng Command.
5.2.1. Command
Là lớp hỗ trợ việc gửi các câu lệnh SQL đến HQT CSDL có CSDL cần
truy cập và hỗ trợ việc đọc dữ liệu gửi về từ HQT CSDL. Một số thuộc tính và
phương thức của lớp Command:

Ý nghĩa

Tên
CommandType

kiểu Command, là một trong ba giá trị: Text (mặc định),
StoredProcedure, TableDirect.

CommandText

tương ứng với CommandType là một trong ba kiểu: câu
lệnh SQL, tên thủ tục lưu trữ, tên bảng.

Connection

đối tượng kết nối.

ExecuteNonQuery() thực thi truy vấn cập nhật (Insert, Delete, Update) và trả
về số lượng dòng dữ liệu bị ảnh hưởng bởi truy vấn.
Giả sử: biến cmd có CommandText là “Delete SINHVIEN
Where masv = A123”;
Khi đó:
int soluong = cmd.ExecuteNonQuery();
Trang 71


ExecuteReader()

thực thi một truy vấn và trả về đối tượng DataReader để
truy cập kết quả truy vấn.

Giả sử: biến cmd có CommandText là “Select * From
SINHVIEN”;
Khi đó:
SqlDataReader rd = cmd.ExecuteReader();

ExecuteScalar()

thực thi một truy vấn và trả về giá trị ở cột đầu tiên của
dòng đầu tên trong bảng kết quả truy vấn.
Giả sử: biến cmd có CommandText là “Select Count(*)
From SINHVIEN”;
Khi đó:
int soluongsv = (int)cmd.ExecuteScalar();

5.2.2. DataReader
Là lớp hỗ trợ việc đọc từng dòng dữ liệu từ bảng dữ liệu trả về của
phương thức ExecuteReader() của một đối tượng Command. Cách đọc dữ liệu
của DataReader cũng tương tự như cách đọc của StreamReader.
Sau đây là một số thuộc tính, phương thức thường dùng của DataReader:
Ý nghĩa

Tên
FieldCount

số cột của bản ghi

HasRows

còn 1 hoặc nhiều dòng dữ liệu chưa đọc tới


IsClosed

không còn trong trạng thái đọc

Close()

kết thúc việc đọc

NextResult()

còn 1 hoặc nhiều dòng dữ liệu chưa đọc tới

Read()

đọc một dòng dữ liệu.

Sau đây là đoạn mã lệnh sử dụng DataReader đọc dữ liệu và đưa dữ liệu
vào một ListBox:
cmd.CommandText="Select * From SINHVIEN";
SqlDataReader rd = cmd.ExecuteReader();
ListBox ds = new ListBox();
Trang 72


while (rd.Read())
{
string st = rd[1].ToString();
ds.Items.Add(st);
}
rd.Close();


Hình 5-2 mô tả mô hình truy cập dữ liệu với Command.

Connection

Tabl
e

Transaction

Command

DeleteCommand
UpdateCommand

Application

Database

InsertCommand
SelectCommand
DataReader
Hình 5-2 Mô hình truy cập dữ liệu với Command

Trong mô hình này, mỗi lần có một thao tác truy cập CSDL, ta mở kết nối
với CSDL để thực hiện các thao tác. Thực hiện xong, ta đóng kết nối.
5.3. Mô hình truy cập dữ liệu nâng cao với cơ sở dữ liệu ảo
5.3.1. DataSet
Là lớp đóng vai trò như là một CSDL ảo. Cơ sở dữ liệu này cũng chứa các
bảng (DataTable), các mối quan hệ giữa các bảng (DataRelation),…

Sau đây là hai thuộc tính thường dùng của DataSet:
Trang 73


- Tables: chứa tập các bảng ảo (DataTable).
- Relations: chứa các mối quan hệ ảo (DataRelation).
5.3.2. DataAdapter
Lớp DataAdapter được xem là cầu nối giữa CSDL (trên Server) và
DataSet (CSDL ảo trên bộ nhớ của máy Client). DataAdapter được xem như là
một Command thông minh, hỗ trợ việc lấy dữ liệu từ CSDL về DataSet và cập
nhật dữ liệu từ DataSet lên CSDL.
Việc cập nhật dữ liệu từ DataSet lên CSDL được hỗ trợ bởi
CommandBuider. CommandBuider hỗ trợ bằng cách tự động sinh các đối tượng
Command thích hợp cho việc cập nhật dữ liệu. CommandBuider sinh các đối
tượng Command dựa vào TableMapping, nơi lưu giữ các thao tác cập nhật dữ
liệu trong DataSet.
Hình 5-3 mô tả mô hình truy cập dữ liệu với cơ sở dữ liệu ảo.

Connection

Tabl
e

Transaction

DataAdapter

Application

Database


DataSet

Command

DataTable

Hình 5-3 Mô hình truy cập dữ liệu với DataSet

Trong mô hình này, trong việc lấy dữ liệu từ CSDL về DataSet, việc
mở/đóng kết nối được thực hiện tương tự như mô hình trước. Tuy nhiên, trong
việc cập nhật dữ liệu từ DataSet lên CSDL, việc mở/đóng kết nối được thực hiện
tự động.
Việc lấy dữ liệu từ CSDL về DataSet được thực hiện qua phương thức
Fill() và việc cập nhật dữ liệu từ DataSet lên CSDL được thực hiện thông qua
phương thức Update(). Các công việc đó có thể được thực hiện như sau:
Bước 1: lấy dữ liệu từ CSDL về DataSet
Giả sử trên CSDL có bảng SINHVIEN
Trang 74


Connection.Open();
cmd.CommandText="Select * From SINHVIEN";
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable sv = new DataTable();
SqlCommandBuider cdb = new SqlCommandBuider(da);
(*)
da.Fill(sv);
Connection.Close();


Chú ý: nếu không thực hiện việc cập nhật từ DataSet lên CSDL như ở
bước 3 thì câu lệnh (*) là không cần thiết.
Bước 2: thực hiện các thao tác cập nhật dữ liệu ở DataSet
Ta thực hiện các thao tác thay đổi dữ liệu như: thêm sinh viên, sửa thông
tin sinh viên nào đó, xóa bớt sinh viên,…
Nếu sau khi thực hiện một số cập nhật mà ta thấy các thao tác này là
không cần thiết thì có thể sử dụng phương thức RejectChanges() của DataTable
sv.
Bước 3: cập nhật dữ liệu từ DataSet lên CSDL
da.Update(sv);

5.4. Buộc dữ liệu
5.4.1. Mô hình truy cập và hiển thị dữ liệu
Hình 5-4 mô tả mô hình truy cập và hiển thị dữ liệu của một ứng dụng:
Dữ liệu vật lý

1

Đối tượng dữ
liệu

3

class,
DataTable,
Mảng

*.mdf, *.txt

1 : Lấy dữ liệu từ


2 : Hiển thị dữ liệu lên

2

Đối tượng hiển
thị dữ liệu

3

TextBox,
ListBox,
DataGridView

3 : Thay đổi dữ liệu đến

Hình 5-4 Mô hình buộc dữ liệu

Như vậy, trong mô hình này có ba thành phần: dữ liệu vật lý, đối tượng
dữ liệu và đối tượng hiển thị dữ liệu. Trong đó:
Dữ liệu vật lý là dữ liệu được lưu trữ trên bộ nhớ. Nó có thể là một file
Trang 75


text bình thường, có thể là một file nhị nhân, có thể là một file tuần tự hay có thể
là một file cơ sở dữ liệu.
Sau đây là các tiến trình trong quá trình truy cập dữ liệu:
- Đầu tiên, chương trình tiến hành đọc dữ liệu vật lý và lưu tạm trong các
đối tượng dữ liệu như: mảng, lớp, DataTable,…
- Tiếp theo, chương trình sẽ hiển thị dữ liệu trong các đối tượng dữ liệu

lên các đối tượng hiển thị dữ liệu như TextBox, ListBox, DataGridView,…
- Sau đó, chương trình tiến hành cập nhật dữ liệu trên giao diện. Các thay
đổi dữ liệu trên các đối tượng hiển thị dữ liệu sẽ được cập nhật đến đối tượng dữ
liệu và đồng thời các thay đổi dữ liệu trên các đối tượng dữ liệu do các tiến trình
khác cũng sẽ được cập nhật đến đối tượng hiển thị dữ liệu. Các thay đổi này có
thể xảy ra nhiều lần.
- Cuối cùng, chương trình sẽ lưu dữ liệu hiện thời trên các đối tượng dữ
liệu xuống dữ liệu vật lý. Chú ý: tiến trình này sẽ làm thay đổi dữ liệu thật đang
lưu trữ nên cần cân nhắc kỹ trước khi tiến hành.
5.4.2. Buộc dữ liệu
Buộc dữ liệu sự kết hợp ăn ý giữa đối tượng dữ liệu (như class, mảng,
DataTable,…) và đối tượng hiển thị dữ liệu (như TextBox, ListBox,…). Nếu
một đối tượng hiển thị dữ liệu được buộc dữ liệu với một đối tượng dữ liệu thì
nếu có sự thay đổi dữ liệu ở đối tượng dữ liệu sẽ làm cho dữ liệu bên đối tượng
hiển thị dữ liệu tự động thay đổi theo và ngược lại. Có hai loại buộc dữ liệu là:
buộc dữ liệu đơn giản và buộc dữ liệu phức tạp.
a) Buộc dữ liệu đơn giản:
Là loại buộc dữ liệu mà tại một thời điểm một giá trị đơn của một đối
tượng dữ liệu này buộc với một điều khiển. Một số điều khiển hỗ trợ buộc dữ
liệu đơn giản như: TextBox, CheckBox, RadioButton,…
Giả sử DataTable sv có các thuộc tính: masv, tensv,… Ta có thể buộc
thuộc tính tensv của sv với TextBox tb bằng cách:
tb.DataBidings.Add(“Text”, sv, “tensv”);

Tương tự, ta có hai TextBox là tb1 và tb2. Sau đây là mã lệnh buộc thuộc
tính Text của hai TextBox này với nhau.
tb1.DataBidings.Add(“Text”, tb2, “Text”);

b) Buộc dữ liệu phức tạp:
Là loại buộc dữ liệu mà các dữ liệu của một đối tượng được buộc với một

điều khiển. Một số điều khiển hỗ trợ buộc dữ liệu phức tạp: ListBox,
ComboBox, DataGridView,…
Trang 76


Các thuộc tính liên quan đến buộc dữ liệu trên các điều khiển:
- DataSource: tên đối tượng dữ liệu.
- DataMember: tên đối tượng cụ thể (DataGridView).
- DisplayMember: thuộc tính hiển thị (ListBox, ComboBox).
- ValueMember: giá trị phân biệt (ListBox, ComboBox).
Giả sử có DataSet ds. Trong ds có DataTable sv. DataTable sv chứa các
trường: masv, tensv,… Ta đoạn mã lệnh sau để buộc dữ liệu cho ListBox lb,
ComboBox cb, DataGridView dv:
lb.DataSource = ds;
lb.ValueMember = “sv.masv”;
lb.DisplayMember = “sv.tensv”;
dv.DataSource = ds;
dv.DataMember = sv;
cb.DataSource = sv;
cb.ValueMember = “masv”;
cb.DisplayMember = “tensv”;

5.5. Câu hỏi và bài tập
1) Sử dụng mô hình truy cập dữ liệu với Command, xây dựng ứng dụng
như bài tập 4) ở chương 3 với dữ liệu là CSDL đã xây dựng ở bài tập
1) ở chương 4.
2) Thêm hỗ trợ giao tác cho bài tập trên.
3) Xây dựng ứng dụng như bài tập 1) với mô hình truy cập dữ liệu nâng
cao với CSDL ảo.
4) So sánh hai mô hình truy cập dữ liệu đã học theo các tiêu chí: tính dễ

sử dụng, tài nguyên sử dụng,… Theo quan điểm cá nhân, anh (chị)
thích mô hình nào hơn?
5) Đề xuất mô hình lai của hai mô hình truy cập dữ liệu đã học. Anh (chị)
có thích mô hình này không?
6) Sử dụng mô hình truy cập dữ liệu với Command, xây dựng ứng dụng
quản lý cả lớp học và sinh viên thuộc biên chế của lớp đó.
7) Xây dựng ứng dụng như bài tập 6) với mô hình truy cập dữ liệu nâng
cao với CSDL ảo.
8) Nêu những hiểu biết về mô hình MVC trong xây dựng một ứng dụng
Windows.
Trang 77


5.6. Bài mẫu
Xây dựng các class, Form phục vụ các yêu cầu sau:
- Xây dựng class có tên là KetNoi để giao tiếp đến CSDL được xây dựng
trong bài tập mẫu ở chương 4. Trong đó có cho phép cập nhật kiểu CSDL ảo.
using System.Data.SqlClient;
using System.Data;
namespace Sample
{
class KetNoi
{
/// <summary>
/// Giá trị ở đây phụ thuộc vào vị trí lưu CDSL cụ thể
/// </summary>
string _chuoiKN = @"Data
Source=.\SQLEXPRESS;AttachDbFilename=E:\
BaiGiang2018\Data\QLSV.mdf;Integrated Security=True;Connect
Timeout=30;User Instance=True";

SqlConnection _kn;
SqlDataAdapter _da;
public SqlDataAdapter MyDataAdapter
{
get { return _da; }
}
public KetNoi()
{
_kn = new SqlConnection(_chuoiKN);
}
/// <summary>
/// Đọc dữ liệu
/// </summary>
/// Câu lệnh SELECT</param>
/// Cho phép CSDL ảo cập
nhật</param>
/// <returns></returns>
public DataTable GetData(string sql,bool update)
{
_kn.Open();
DataTable dt = new DataTable();
_da = new SqlDataAdapter(sql, _kn);
if (update)
{
SqlCommandBuilder cmb = new
SqlCommandBuilder(_da);
}
_da.Fill(dt);
Trang 78



_kn.Close();
return dt;
}
/// <summary>
/// Thực hiện cập nhật dữ liệu lên CSDL
/// </summary>
/// INSERT/UPDATE/DELETE SQL</param>
public void UpdateData(string sql)
{
_kn.Open();
SqlCommand cmd = new SqlCommand(sql, _kn);
cmd.ExecuteNonQuery();
_kn.Close();
}
public DataTable GetDSLop()
{
string sql = "Select malop from LOP";
return GetData(sql, false);
}
public DataTable GetDSSV(string malop)
{
string sql = "Select * from SINHVIEN Where
malop='" + malop + "'";
return GetData(sql, false);
}
public DataTable GetTTSV(string masv)
{
_kn.Open();
SqlCommand cmd = new SqlCommand("select * from

Fun_LayTT(@masv);", _kn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@masv", masv);
DataTable dtsv = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dtsv);
_kn.Close();
return dtsv;
}
}
}

- Xây dựng class MySinhVien để hỗ trợ sinh các câu lệnh thêm, sửa, xóa
cho sinh viên:
namespace Sample
{
class MySinhVien:SinhVien
{
public MySinhVien() { }
Trang 79


public MySinhVien(string masv, string hotensv, string
ngaysinh, string gioitinh, string malop):base(masv, hotensv,
ngaysinh, gioitinh, malop){}
// Sinh câu lệnh Insert cho sinh viên hiện tại
public string GetInsertSQL()
{
int gt = this.GioiTinh ? 1 : 0;
return "Insert Into SINHVIEN values ('"+

this.MaSV+"',N'"+
this.HoTenSV.HoDem+"',N'"+
this.HoTenSV.Ten+"',"+
this.NgaySinh.ToShortDateString()+","+
gt+",'"+
this.MaLop+"')";
}
// Sinh câu lệnh Update cho sinh viên hiện tại
public string GetUpdateSQL()
{
int gt = this.GioiTinh ? 1 : 0;
return "Update SINHVIEN set hodem=N'"+
this.HoTenSV.HoDem+"',ten=N'"+
this.HoTenSV.Ten+"',ngaysinh='"+
this.NgaySinh.ToShortDateString()+"',gioitinh="+
gt+",malop='"+
this.MaLop+"' Where masv='"+
this.MaSV+"'";
}
// Sinh câu lệnh Delete cho sinh viên hiện tại
public string GetDeleteSQL()
{
return "Delete From SINHVIEN Where masv='"+
this.MaSV+"'";
}
}
}

- Xây dựng Form cho phép quản lý dữ liệu của bảng LOP như việc quản
lý dữ liệu trên MS SQL Server:

+ Thiết kế giao diện:

Trang 80


×