13.5Tìm kiếm dữ liệu trong Recordset và bảng
Sau khi tạo một cơ sở dữ liệu và nhập liệu, ta cần một cách để định vị các mẩu tin riêng rẽ trong một recordset. Quá trình định vị một mẩu tin riêng rẽ trong recordset theo một tiêu chí chỉ định trước nào đó trong chương trình gọi là tìm kiếm.
Tìm kiếm khác với truy vấn là một truy vấn thì trả về một recordset. Tìm kiếm duyệt qua các mẩu tin trong recordset hiện hành để tìm ra một mẩu tin thoả mãn tiêu chí chỉ định.
Có một số kỹ thuật tìm kiếm dữ liệu. Sử dụng phương thức nào là tuỳ thuộc vào loại cấu trúc dữ liệu ta đang truy cập :
-
Nếu ta đang làm việc với một recordset, ta dùng các phương thức Find-FindFirst, FindNext, FindLast và FindPrevious.
-
Nếu ta truy cập trực tiếp đến một recordset kiểu bảng, ta có thể dùng phương thức Seek để định vị mẩu tin. Phương thức này khó lập trình hơn, nhưng nó nhanh hơn vì ta có thể dùng một chỉ mục của bảng với phương thức Seek.
13.5.1Sử dụng phương thức Find để định vị mẩu tin trong một recordset
Để tìm một mẩu tin trong một Recordset, ta dùng một trong bốn phương thức tìm kiếm của đối tượng Recordset :
-
FindFirst
-
FindLast
-
FindNext
-
FindPrevious
Cú pháp của bốn phương thức như nhau - để sử dụng một trong bốn phương thức tìm kiếm này, ta truyền một mệnh đề WHERE của SQL vào phương thức chỉ ra thông tin ta cần tìm kiếm. Sau khi thi hành phương thức, mẩu tin hiện hành trong đối tượng Recordset trở thành mẩu tin thoả mãn tiêu chí WHERE. Nếu tìm kiếm không định vị được mẩu tin yêu cầu, thuộc tính NoMatch của đối tượng Recordset có giá trị là True.
Loại phương thức ta dùng cũng xác định cách thức tìm thấy mẩu tin. Ví dụ, nếu dùng FindFirst , bộ máy cơ sở dữ liệu sẽ di chuyển đến mẩu tin thứ nhất trong recordset thoả tiêu chí. FindNext và FindPrevious, ngược lại, tìm các mẩu tin hiện hành.
Điểm quan trọng cần lưu ý là, khác với một câu truy vấn SELECT của SQL, tìm kiếm không sinh ra một recordset. Khi bộ máy cơ sở dữ liệu tìm ra mẩu tin thoả tiêu chí tìm kiếm, nó di chuyển đến mẩu tin đó; mẩu tin trở thành mẩu tin hiện hành. Nếu không có mẩu tin tìm thấy, mẩu tin hiện hành sẽ được giữ nguyên và thuộc tính NoMatch của đối tượng Recordset có giá trị là True.
13.5.2Sử dụng phương thức Seek để thi hành tìm kiếm theo chỉ mục
Để tiến hành một tìm kiếm trên một chỉ mục, trước hết bảng phải có một chỉ mục.
Ví dụ sau đây, giả định rằng ta có một bảng tblCustomer với một chỉ mục trên trường LastName. Tên của chỉ mục là LastNameIndex.
Option Explicit
' References MS DAO 3.51 Object Library
Private db As Database
Private rs As Recordset
Private Sub Form_Load()
Set db = OpenDatabase("..\..\db\novelty.mdb")
Set rs = db.OpenRecordset("tblCustomer", dbOpenTable)
End Sub
Private Sub cmdSeek_Click()
rs.Index = "LastNameIndex"
rs.Seek "=", txtLastName.Text
If rs.NoMatch Then
' not found
MsgBox "No customer by that name was found.", vbExclamation
Else
' return info
MsgBox rs!Address & vbCrLf & _
rs!City & ", " & rs!State & " " & _
rs!Zip & vbCrLf & _
rs!Phone, _
vbInformation, _
rs!FirstName & " " & rs!LastName
End If
End Sub
Điểm hạn chế của phương thức Seek là khả năng tìm kiếm trên một trường duy nhất và nó phải được đánh chỉ mục. Ngoài ra nó chỉ sử dụng các toán tử sau : >;<;>=;<=;=
Khác với phương thức Seek , vốn hạn chế thì phương thức Find cho phép ta sử dụng các toán tử có sẵn của SQL như Like , in .
13.5.3Lặp qua suốt tập hợp Indexes của TableDef
Để xác định các chỉ mục tồn tại trong một bảng, ta có thể lặp qua suốt tập hợp Indexes của đối tượng TableDef.
Option Explicit
' References MS DAO 3.51 Object Library
Private db As Database
Private rs As Recordset
Private Sub Form_Load()
Set db = OpenDatabase("..\..\db\novelty.mdb")
End Sub
Private Sub cmdShowIndexes_Click()
Dim td As TableDef
Dim ind As Index
Dim f As Field
Set td = db.TableDefs("tblCustomer")
For Each ind In td.Indexes
Debug.Print ind.Name
For Each f In ind.Fields
Debug.Print " On field: " & f.Name
Next
Next
End Sub
Lưu ý:Có thể dùng đoạn chương trình tương tự như trên để lặp qua suốt các tập hợp khác của DAO. Ví dụ, có thể dùng chương trình này để xem tất cả cơ sở dữ liệu trong một workspace, các định nghĩa truy vấn QueryDef trong một cơ sở dữ liệu, hoặc là các trường trong một TableDef.
13.5.4Sử dụng thuộc tính Bookmark để ghi nhớ vị trí trong một Recordset
Khi ta tiến hành các tác vụ trên một đối tượng Recordset, ta thường di chuyển đây đó trong recordset. Dùng thuộc tính Bookmark của đối tượng Recordset để giữ lại một vị trí sao cho ta có thể quay lại ví trí đó sau này.
Thuộc tính Bookmark cho ta một cách hiệu quả di chuyển giữa hai hay nhiều mẩu tin. Sử dụng bookmark thì nhanh hơn là lặp đi lặp lại phương thức Find để di chuyển qua từng mẩu tin.
Mỗi mẩu tin trong một recordset có thể đánh dấu bookmark được có một số hiệu bookmark duy nhất để ta có thể đọc ra hay ghi vào tại một thời điểm bất kỳ. Tuy nhiên, bookmark không được chứa trong cơ sở dữ liệu; nó được phát sinh tự động khi một đối tượng recordset được tạo và bị huỷ bỏ khi đối tượng recordset bị huỷ.
Để sử dụng bookmark, ta theo các bước sau:
-
Di chuyển đến vị trí trong recordset ta muốn đánh dấu bookmark.
-
Để gán giá trị thuộc tính bookmark của đối tượng Recordset cho một biến chuỗi. Nó sẽ lưu bookmark duy nhất cho mẩu tin hiện hành.
-
Khi ta muốn quay lại mẩu tin, đổi thuộc tính Bookmark của recordset là giá trị của biến chuỗi. Mẩu tin hiện hành sẽ được đổi sang mẩu tin bookmark.
Lưu ý: Không phải mọi kiểu đối tượng Recordset đều hỗ trợ thuộc tính Bookmark. Để xác định xem ta có thể đánh dấu bookmark trên một kiểu recordset hay không , kiểm tra giá trị của thuộc tính bookmarkable. Nếu thuộc tính này là True, ta có thể đánh dấu bookmark trên Recordset.
13.5.5sử dụng tập hợp Errors và đối tượng Error để xử lý lỗi
Ứng dụng có thể xử lý lỗi trong DAO bằng cách sử dụng đối tượng Error và tập hợp Errors. Bởi vì Errors có sẵn trong lập trình cơ sở dữ liệu, một hoạt động nào đó đều có thể phát sinh nhiều hơn một lỗi. (Điều này chính xác với lập trình Client / Server , trong đó, ví dụ như khi server bị treo, tầng trung gian bị ảnh hưởng theo và trình điều khiển ODBC sẽ bị thất bại). Cả 3 tầng này đều phát sinh thông báo lỗi của riêng chúng, nhưng ta sẽ không thấy các thông báo lỗi này trừ phi ta có một tập hợp để duyệt qua).
Tập hợp Errors, thay vì đối tượng Error duy nhất, cho phép ta duyệt qua tất cả lỗi để xác định nguyên nhân vấn đề.
Ví dụ sau đây trình bày cách lặp xuyên qua tập hợp Errors của DBEngine để xem các lỗi phát sinh.
Option Explicit
' References: MS DAO 3.51
Dim db As Database
Dim rs As Recordset
Private Sub cmdBadFileName_Click()
On Error GoTo ErrHandler
Set db = OpenDatabase("..\..\DB\slez.mdb")
Exit Sub
ErrHandler:
Dim DBError As Error
Debug.Print "Contents of DBEngine Errors Collection"
Debug.Print "--------------------------------------"
For Each DBError In DBEngine.Errors
Debug.Print DBError.Description
Next
End Sub
Chia sẻ với bạn bè của bạn: |