(NB) Bài giảng Lập trình C: Phần 2 được biên soạn nhằm cung cấp cho các bạn những kiến thức về Quản lý dữ liệu với Microsoft SQL Serve, Truy cập cơ sở dữ liệu với ADO.NET, Report và đóng gói ứng dụng.
Trang 1Trang 56
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> <có
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 2Trang 57
đượ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
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 3Trang 58
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
a) Thao tác 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
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 4Trang 59
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
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
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 5Trang 60
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ự)
Trang 6[^] : 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
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 7INSERT 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],
magvcn
SINHVIEN
# masv tensv ngaysinh quequan malop
Trang 8Trang 63
[,…,<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”:
[WHERE <điều kiện>]
Ví dụ: Xóa các sinh viên có mã là “SV011”:
DELETE FROM [SINHVIEN]
[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 9Trang 64
- 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:
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
Trang 104.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ữ
Trang 11Trang 66
- 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 12Trang 67
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:
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 13ConnectionString 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 145.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ự:
Trang 15Phươ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 16Trang 71
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:
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:
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 17Trang 72
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”;
Sau đây là một số thuộc tính, phương thức thường dùng của DataReader:
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
Trang 18Hình 5-2 mô tả mô hình truy cập dữ liệu với Command
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
Trang 19Trang 74
- 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
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 20Trang 75
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:
TextBox, ListBox, DataGridView
1 : Lấy dữ liệu từ 2 : Hiển thị dữ liệu lên 3 : Thay đổi dữ liệu đến
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
Hình 5-4 Mô hình buộc dữ liệu
Trang 21Trang 76
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:
Trang 22Trang 77
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:
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 23Trang 78
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
/// <param name="sql">Câu lệnh SELECT</param>
/// <param name="update">Cho phép CSDL ảo cập
DataTable dt = new DataTable ();
_da = new SqlDataAdapter (sql, _kn);
Trang 24/// <param name="sql">INSERT/UPDATE/DELETE SQL</param>
public void UpdateData(string sql)
string sql = "Select malop from LOP";
return GetData(sql, false);
DataTable dtsv = new DataTable ();
SqlDataAdapter da = new SqlDataAdapter (cmd);