Kết nối cơ sở dữ liệu với ADO

Một phần của tài liệu Tài liệu hướng dẫn thực tập tốt nghiệp công nghệ thông tin (Trang 61 - 68)

CHƯƠNG I Công cụ lập trình

I.5.Kết nối cơ sở dữ liệu với ADO

Visual Basic 6 cho ta sự lựa chọn về kỹ thuật khi lập trình với database, hoặc là dùng DAO

(đây là kỹ thuật đã cũ), hoặc là dùng ADO (ActiveX Data Objects).

ADO cho phép ta làm việc với mọi loại nguồn dữ liệu (data sources), không nhất thiết phải

là Access Database hay ODBC. Nguồn dữ liệu có thể là một file text, trong đó mỗi dịng là

một record gồm những fields ngăn cách bởi các dấu phẩy.

Với ADO cho ta kết nối (connect) với một database qua một Connection bằng cách chỉ định một Connection String. Trong Connection String có Database Provider (thí dụ như Jet,

ISAM, Oracle, SQLServer..v.v.), tên Database, UserName/Password để logon vào m ột

database v.v...

Có thể coi Access Database (*.mdb) là m ột database điển hình bao gồm các table (bảng),

mỗi table gồm các record (bản ghi – dòng trong b ảng), mỗi dòng gồm các field (trường –

cột trong bảng). Trong ADO, người ta còn sử dụng khái niệm recordset (tập các bản ghi) để thay cho table. M ột recordset không nh ất thiết lúc nào c ũng là m ột table có s ẵn trong

database, mà có thể là kết quả của một câu query trích dữ liệu từ một hoặc nhiều table trong database đó.

VB6 cung cấp một control có tên là ADO Data cho phép bạn kết nối đến database, lấy về

một recordset, di chuyển qua từng record của recordset để lấy dữ liệu. Bình thường, khi bạn mới khởi động một project VB6 mới, Control ADO Data khơng có sẵn. Muốn có nó, bạn

hãy dùng Menu Project | Components...(phím tắt Ctrl+T), rồi chọn Microsoft ADO Data

Control 6.0 (OLEDB) từ giao diện Components như dưới đây:

I.5.1. Thiết lập Connection String

Bạn hãy bắt đầu một dự án VB6 m ới, đặt tên là ADODataControl bằng cách chọn tên

project trong Project Explorer bên ph ải rồi sửa thuộc tính Name trong Properties Window.

Form chính đặt tên (thu ộc tính Name) là frmADO, nhãn (thu ộc tính Caption) là ADO DataControl Demo.

Nháy đúp chuột lên Icon c ủa Control Data ADO (xem hình v ẽ) trong Toolbox. M ột

Control Data ADO tên Adodc1 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 đặt lại thuộc tính Align của nó trong Properties Window

thành 2 - vbAlignBottom.

Trên cửa sổ Properties Windows, chọn thuộc tính (Custom), sau đó click lên nút Browse để hộp thoại Property Pages hiện ra. Trong hộp thoại này, trên Tab General chọn Radio (Option) Button Use Connection String (hình vẽ) rồi click nút Build....

Trong hộp thoại Data Link Properties, Tab Provider, chọn Microsoft Jet 3.51 OLE DB Provider, rồi click nút Next >>.

Ở chỗ Select or enter a database name ta ch ọn C:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB, trong máy của bạn có thể file này thường nằm trên ổ đĩa C.

Sau đó, bạn có thể click nút Test Connection phía dưới để thử xem connection có được

thiết lập tốt khơng. Nếu mọi việc tốt đẹp, bạn sẽ nhận được thông báo Test Connection

I.5.2. Thiết lập RecordSource

Lập connection xong r ồi, ta chỉ định Recordset bằng cách chọn thuộc tính RecordSource (adsbygoogle = window.adsbygoogle || []).push({});

của control Adodc1, click vào nút Browse bên phải. Trong hộp thoại Property Pages vừa hiện ra, chọn 2-adCmdTable làm Command Type, kế đó mở Combo box cho Table or Stored Procedure Name để chọn table Titles (trong database Biblio.mdb). V ới thao tác

này, bạn đã xác định được Recordset hiện tại của Adodc1 là bảng Titles

Tùy theo cách ta dùng Recordset trong ADO, nó có ba loại và được gọi là Cursor Type: - Static Cursor: Static Cursor cho bạn một static copy (bảo sao tĩnh) của các records.

Trong lúc b ạn dùng Static Cursor, n ếu có ai khác s ửa đổi hay thêm, b ớt gì vào

recordset bạn sẽ không thấy.

- Keyset Cursor: Keyset Cursor hơn Static Cursor ở chỗ trong lúc bạn dùng nó, nếu

có ai sửa đổi record nào b ạn sẽ biết. Nếu ai xóa record nào, b ạn sẽ khơng thấy nó

- Dynamic Cursor: Trong lúc b ạn đang dùng một Dynamic Cursor, n ếu có ai khác

sửa đổi hay thêm, bớt gì vào recordset bạn sẽ thấy hết.

Bạn hãy chọn trị số 2-adOpenDynamic cho property Cursor Type của Adodc1:

I.5.3. Bind control với ADO Data

Với các thao tác mô tả trên, bạn đã hoàn thành việc xác định một ADO Data đầy đủ, để thể

hiện dữ liệu từ ADO Data control ra form, b ạn phải tiếp tục thực hiện bước bind các control với ADO Data. Hầu hết các control (Text Box, Combo Box, List Box, Picture,

Grid...) đều có thể bind dữ liệu. Tuy nhiên, trong phạm vi các ứng dụng Tin học Xây dựng,

chúng ta thường sử dụng các bảng (grid) để thể hiện dữ liệu. Do đó, trong ví dụ này, chúng ta cũng sử dụng grid. Có 2 loại grid thường được sử dụng:

- Microsoft Data Grid Control 6.0 (OLDDB) : Số hiệu phiên bản có thể khác trên

máy tính của bạn. Đây là grid chuẩn của Microsoft xây dựng để làm việc với ADO

Data. Tuy nhiên, grid này còn nghèo nàn về chức năng.

- VideoSoft VSFlexGrid 7.0 (OLEDB): Đây là grid được xây dựng bởi hãng thứ 3

(không phải Microsoft). Grid cho phép bạn bind dữ liệu với ADO Data hoặc sử dụng trực tiếp, khơng thơng qua ADO Data (unbind). VSFlexGrid có nhi ều tính n ăng

thuận tiện hơn. Phần cài đặt và thêm VSFlexGrid control vào project, xin xem

(I.4.1.2)

Trong ví dụ này chúng ta sẽ sử dụng VSFlexGrid: Thêm VSFlexGrid control vào form. Tên mặc định c ủa control m ới này là VSFlexGrid1. Ch ọn VSFlexGrid1, trong Properties

Windows, sửa thuộc tính DataSource của nó thành Adodc1 (bạn chỉ cần chọn thuộc tính,

click vào ComboBox bên phải đển chọn DataSource).

Đến đây, mặc dầu chưa viết một hàng code nào, bạn có thể chạy chương trình và nó sẽ hiển

I.5.4. Làm việc với Database bằng code

Ví dụ trên cho phép ta kết nối với database mà khơng cần sử dụng một dịng code nào. Ưu điểm của phương pháp này là visual nên dễ học đối với người mới bắt đầu. Tuy nhiên, khi

sử dụng với các mục đích phức tạp hơn hoặc trong triển khai cài đặt trên nhiều máy tính

khác nhau thì phương pháp này bộc lộ khá nhiều hạn chế. (adsbygoogle = window.adsbygoogle || []).push({});

Theo kinh nghiệm của chúng tôi, các b ạn nên phát triển ứng dụng của mình bằng cách sử

dụng code, bạn có thể can thiệp sâu hơn vào database cũng như có thể thực hiện được nhiều chức năng phức tạp hơn, không phụ thuộc vào đường dẫn tuyệt đối của database. Hãy theo

dõi ví dụ sau:

Tạo mới project, thêm VSFlexGrid vào project c ủa bạn (menu Project | Components ). Thêm VSFlexGrid control vào form với tên mặc định là VSFlexGrid1.

Chọn menu Project | References, trên hộp thoại References, tick vào th ư viện Microsoft

ActiveX Data Object 2.5 Library (số hiệu phiên bản có thể khác trên máy tính của bạn).

Thêm đoạn code rất đơn giản sau đây vào form Option Explicit

Private Sub Form_Load()

Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset

' Mở connection trỏ đến Biblio.mdb database

' Nếu cài đặt trên máy tính khác & file Biblio.mdb ở cùng đường dẫn với ' chương trình, bạn có thể sử dụng App.Path thay cho "C:\Pro...."

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _

"C:\Program Files\Microsoft Visual Studio\VB98\" & "BIBLIO.MDB"

' Tạo recordset lấy cột [Title] của bảng [Titles]

' Trong query, không nên sử dụng "select *..." mà nên để tường mình các ' tên trường

' Bind VSFlexGrid1 vào recordset vừa tạo ra

Set VSFlexGrid1.DataSource = rs End Sub

Bạn có thể thấy ngay đoạn code này cũng cho kết quả tương tự như ví dụ trước, nhưng đơn

giản và rõ ràng h ơn nhiều. Đó là chưa kể đến việc nó sẽ khơng phụ thuộc vào đường dẫn

tuyệt đối của database.

Ngoài ra, trong đồ án tốt nghiệp Tin học Xây dựng, rất nhiều bạn lấy dữ liệu từ các file

MDB của SAP2000 đưa vào các recordset. Sau đó sử dụng các thao tác MoveNext, MoveFirst, MoveLast, MovePrevious để di chuyển giữa các record. Tệ hơn là có bạn lặp đi lặp lại thao tác này nhiều lần dẫn đến chương trình chạy rất chậm (thời gian có khi tính đến phút), nhất là đối với dữ liệu khoảng trên 1 vạn phần tử.

Để tránh những trường hợp đáng tiếc này, xin lưu ý các bạn là đối với các recordset phải sử

dụng lại nhiều lần. Nên tránh làm việc trực tiếp với Recordset bằng cách chuyển toàn bộ

Recordset này ra một mảng bằng thao tác GetRows (Tỷ lệ nhanh hơn so với phương pháp

cũ trung bình là khoảng 5 lần phụ thuộc vào số lần duyệt toàn bộ Recordset).

Trong trường hợp chỉ duyệt 1 lần, bạn không cần phải sử dụng GetRows nhưng nên lưu ý

là Open recordset với các tham số là adOpenForwardOnly và adLockReadOnly (xem ví

dụ), với các tham số này bạn chỉ có thể duyệt recordset theo chiều tiến nhưng tốc độ nhanh

gấp đôi. (adsbygoogle = window.adsbygoogle || []).push({});

Option Explicit

' GetTickCount: số mili giây kể từ khi bật máy tính – dùng để đo thời gian

Private Declare Function GetTickCount Lib "kernel32" () As Long Dim cn As New ADODB.Connection

Dim rs As New ADODB.Recordset

Private Sub Form_Load()

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _

"C:\Program Files\Microsoft Visual Studio\VB98\" & "BIBLIO.MDB" ' Mở recordset với chế độ này chỉ cho phép duyệt theo chiều tiến

' Nhưng tốc độ nhanh gấp đôi

rs.Open "select Title, Subject from titles", cn, adOpenForwardOnly, _ adLockReadOnly

End Sub

Private Sub Command1_Click() Dim q As Variant

Dim a As Long

Dim i As Integer, j As Integer Dim b As String

q = rs.GetRows ' Lấy toàn bộ dữ liệu trong recordset vào 1 mảng 2 chiều For i = 1 To 10 ' Duyệt mảng 10 lần

For j = 1 To UBound(q, 2)

b = q(0, j) ' Lấy cột đầu tiên (Title) trong recordset Next

Next

MsgBox GetTickCount – a ' Hiện ra số mili giây để duyệt 10 lần recordset

End Sub

Private Sub Command2_Click() Dim a As Long

Dim i As Integer Dim b As String

a = GetTickCount ' Bắt đầu tính thời gian duyệt For i = 1 To 10 ' Duyệt recordset 10 lần

rs.MoveFirst ' Về đầu recordset Do While Not rs.EOF

b = rs.Fields(0) ' Lấy dữ liệu cột đầu tiên (Title) rs.MoveNext ' Chuyển sang bản ghi kế tiếp Loop

Next

MsgBox GetTickCount – a ' Hiện ra số mili giây để duyệt 10 lần recordset

End Sub

Đoạn chương trình ví dụ trên thực hiện việc mở table Titles của database Biblio.mdb, sau đó (adsbygoogle = window.adsbygoogle || []).push({});

duyệt qua table 10 l ần theo 2 phương pháp. Khi click nút Command1 thì s ẽ đưa tất cả dữ

liệu vào 1 mảng rồi duyệt. Khi click nút Command2 thì duyệt bằng các thao tác MoveNext

giữa các record. Sau khi quá trình duyệt kết thúc thì đưa ra khoảng thời gian (tính bằng mili

giây) để so sánh tốc độ của 2 phương pháp.

Ngồi ra, có một điểm đáng chú ý là: Khi tìm ki ếm dữ liệu theo điều kiện thì nên sử dụng

các câu lệnh SQL để lọc dữ liệu hơn là lấy toàn bộ dữ liệu về recordset rồi dùng vịng lặp để tìm kiếm. Các câu lệnh SQL được tối ưu cho quá trình tìm kiếm nên thực hiện nhanh hơn rất nhiều.

Một phần của tài liệu Tài liệu hướng dẫn thực tập tốt nghiệp công nghệ thông tin (Trang 61 - 68)