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

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 Tin học xây dựng - Chương 1 pptx (Trang 59 - 61)

, vbCtrlMask vbKeyV End With

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ế.

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à adOpenForwardOnlyadLockReadOnly (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.

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 đó 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.

Ngoà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 Tin học xây dựng - Chương 1 pptx (Trang 59 - 61)