
Lập trình trực quan
202
BÀI 22. SỬ DỤNG CONTROL DATA
22.1. Control Data
Từ VB5, Visual Basic cho lập trình viên một control để truy cập cơ sở dữ liệu, tên nó chỉ
đơn sơ là Data. Như ta biết, có một cơ sỡ dữ liệu Microsoft gói kèm theo VB6 - đó là Jet
Database Engine. Jet Database Engine là công cụ xử lý dữ liệu của MS Access Database
Management System.
Cho đến VB5, Microsoft cho ta ba kỹ thuật chính:
- DAO (Data Acess Objects): DAO là kỹ thuật đặc biệt của Microsoft, chỉ để dùng với
Jet Database Engine. Nó rất dễ dùng, hiệu năng và tiện, nhưng bị giới hạn trong phạm vi
MS Access. Dầu vậy, nó rất thịnh hành vì rất dễ sử dụng và mang lại hiệu quả cao.
- ODBC (Open Database Connectivity): ODBC được thiết kế để cho phép người sử
dụng nối với đủ loại databases mà chỉ dùng một method duy nhất. Điều này cất bớt gánh
nặng cho lập trình viên, để chỉ cần học một kỹ thuật lập trình duy nhất mà có thể làm việc
với bất cứ loại database nào. Nhất là khi sau này nếu cần phải thay đổi loại database, như
nâng cấp từ Access lên SQLServer chẳng hạn, thì sự sửa đổi về coding rất ít. Khi dùng
ODBC chung với DAO, ta có thể cho Access Database nối với các databases khác. Có một
bất lợi của ODBC là hơi phức tạp khi sử dụng.
- RDO (Remote Data Object): Một trong những lý do chính để RDO được thiết kế là
giải quyết khó khăn về sự rắc rối của ODBC. Cách lập trình với RDO đơn giản như DAO,
nhưng thật ra nó dùng ODBC nên cho phép người sử dụng nối với nhiều databases. Tuy
nhiên, RDO không được thịnh hành lắm.
VB6 tiếp tục hổ trợ các kỹ thuật nói trên, và cho thêm một kỹ thuật truy cập database mới,
rất quan trọng, đó là ADO (ActiveX Data Objects). Trong một bài tới ta sẽ khảo sát về ADO
với những ưu điểm của nó. Tuy nhiên, vì DAO rất đơn giản và hiệu năng nên ta vẫn có thể
tiếp tục dùng nó rất hữu hiệu trong hầu hết các áp dụng. Do đó bài này và bài kế sẽ tập trung
vào những kỹ thuật lập trình phổ biến với DAO.

Lập trình trực quan
203
Cách dùng giản tiện của control Data là đặt nó lên một Form rồi làm việc với những
Properties của nó. Chúng ta hãy bắt đầu một dự án VB6 mới, cho nó tên DataControl bằng
cách click tên project trong Project Explorer bên phải rồi edit property Name trong Properties
Window.
DoubleClick lên Icon của Control Data trong Toolbox. Một Control Data tên Data1 sẽ hiện
ra trên Form. Muốn cho nó nằm bên dưới Form, giống như một StatusBar, hãy set property
Align của nó trong Properties Window thành 2 - Align Bottom.
Click bên phải dòng property DatabaseName, kế đó click lên nút browse có ba chấm để
chọn một file Access dabase từ giao thoại cho Data1. Ở đây ta chọn E:\Program
Files\Microsoft Visual Studio\VB98\BIBLIO.MDB , trong computer của chúng ta có thể nó
nằm trên disk C hay D.
Trong chương trình này ta muốn làm việc với table Titles của database BIBLIO.MDB, để xem
và edit các records. Để ý property DefaultType của Data1 có trị số 2- UseJet, tức là dùng kỹ
thuật DAO, thay vì dùng kỹ thuật ODBC.

Lập trình trực quan
204
Khi chúng ta click lên property Recordsource của Data1, rồi click lên cái tam giác nhỏ
bên phải, một ComboBox sẽ mở ra cho ta thấy danh sách các tables trong database. Chúng ta
hãy chọn Titles. Để ý property RecordsetType của Data1 có trị số là 0 - Table:
Thuật ngữ mới mà ta sẽ dùng thường xuyên khi truy cập dữ liệu trong VB6 là Recordset
(bộ các bản ghi). Recordset là một tập hợp các bản ghi, nó có thể chứa một số các bản ghi hay
không có bản ghi nào cả. Một bản ghi trong Recordset có thể là một bản ghi lấy từ một Table.
Trong trường hợp ấy có thể ta lấy về tất cả records trong table hay chỉ những records thỏa mãn
một điều kiện, ví dụ như ta chỉ muốn lấy các bản ghi của những sách xuất bản trước năm 1990
(Year Published < 1990).
Một bản ghi trong Recordset cũng có thể là tập hợp các cột (columns) từ hai hay nhiều
tables qua các mối liên hệ one-to-one và one-to-many. Ví dụ như khi lấy các records từ table
Titles, ta muốn có thêm chi tiết tên công ty (Company Name) và điện thoại (Telephone) của
nhà xuất bản (table Publishers) bằng cách dùng Foreign Key PubID trong table Titles làm
Primary Key trong table Publishers để lấy các chi tiết ấy. Nếu chúng ta chưa nắm vững ý niệm
Foreign Key thì hãy đọc lại bài Database.
Trong trường hợp ấy ta có thể xem như có một virtual table là tập hợp của hai tables Titles
và Publishers.
Bây giờ chúng ta hãy đặt lên Form 4 labels với captions: Title, Year Published, ISBN và
Publisher ID. Kế đó cho thêm 4 textboxes tương ứng và đặt tên chúng là txtTitle,
txtYearPublished, txtISBN và txtPublisherID.

Lập trình trực quan
205
Chọn textbox txtTitle, rồi set property Datasource của nó trong Properties Window thành
Data1. Khi click lên property Datafield của txtTitle và mở ComboBox ra chúng ta sẽ thấy liệt
kê tên các Fields trong table Titles. Đó là vì Data1 được coi như trung gian lấy table Titles từ
database. Ở đây ta sẽ chọn cột Title.
Lập lại công tác này cho 3 textboxes kia, và chọn các cột Year Published (năm xuất bản),
ISBN (số lý lịch trong thư viện quốc tế), và PubID (số lý lịch nhà xuất bản) làm Datafield cho
chúng.
Tới đây, mặc dầu chưa viết một dòng code, ta có thể chạy chương trình được rồi. Nó sẽ
hiển thị chi tiết của bản ghi đầu tiên trong table Titles như dưới đây:
Chúng ta có thể bấm các nút di chuyển Navigator Buttons để đi đến các bản ghi đầu (first),
trước (previous), kế (next) và cuối (last). Mỗi lần chúng ta di chuyển đến một bản ghi mới là
chi tiết của bản ghi ấy sẽ hiển thị. Nếu không dùng các Navigator Buttons, ta cũng có thể code

Lập trình trực quan
206
để làm công tác tương đưong bằng cách gọi các Recordset methods MoveFirst, MovePrevious,
MoveNext và MoveLast.
Khi bản ghi cuối của Recordset đang hiển thị, nếu ta gọi method MoveLast thì property
EOF (End-Of-File) của Recordset trở thành True. Tương tự như vậy, khi bản ghi thứ nhất của
Recordset đang hiển thị, nếu ta gọi method MovePrevious thì property BOF (Begin-Of-File)
của Recordset trở thành True. Nếu một Recordset không có chứa một bản ghi nào cả thì cả hai
properties EOF và BOF đều là True.
Đặc tính hiển thị dữ liệu trong các textboxex theo đúng bản ghi hiện thời (current record)
được gọi là data binding hay data bound (ràng buộc dữ liệu) và control TextBox hỗ trợ chức
năng này được nói là Data Aware (nhận biết dữ liệu).
Khi bản ghi đầu tiên đang hiển thị, nếu chúng ta edit Year Published để đổi từ 1985 thành
1983 rồi click Navigator button Next để hiển thị bản ghi thứ nhì, kế đó click Navigator button
Previous để hiển thị lại bản ghi đầu tiên thì chúng ta sẽ thấy là field Year Published của bản
ghi đầu tiên đã thật sự được thay đổi (updated) thành 1983.
Điều này có nghĩa rằng khi Data1 navigates từ bản ghi này đến bản ghi khác thì nếu bản ghi
này đã có sự thay đổi vì người sử dụng edited, nó lưu trữ sự thay đổi đó trước khi di chuyển.
Chưa chắc là chúng ta muốn điều này, do đó, nếu chúng ta không muốn người sử dụng tình cờ
edit một bản ghi thì chúng ta có thể set property Locked của các textboxes ấy thành True để
người sử dụng không thể edit các textboxes như trong hình dưới đây: