IV. Xây dựng ứng dụng Visual Basic với Ado
4. làm việc với con trỏ trong Ado
Tương tự RDO và DAO, ADO hỗ trợ một số kiểu con trỏ. Ngồi ra việc cung cấp hỗ trợ duyệt qua từng mẫu tin tại một thời điểm, các kiểu con trỏ khác nhau cho phép ta điều khiển cách quản lý của một Recordset.
Quy định vị trí của con trỏ bằng cách gán giá trị cho thuộc tính Recordset. Sau đây là các kiểu con trỏ của đối tượng Connection:
Kiểu con trỏ Hằng Mơ tả
Phía Client adUseClient Tạo con trỏ phía Client Phía Server adUseServer Tạo con trỏ phía Server Chọn con trỏ kiểu Client nghĩa là ADO và OLEDB xử lý các hoạt động của con trỏ. Con trỏ kiểu Client thường khơng cĩ sẵn trên server.
Ví dụ: trong ADO, ta cĩ thể tạo một Recordset khơng kết nối, cho phép ta thao tác với các mẫu tin mà khơng cĩ kết nối thường xuyên đến server. Khả năng này là một chức năng của thư viện con trỏ phía Client.
Luan van tot nghiep Trang 79
Trong ADO, thuộc tính CursorLocation áp dụng cho cả đối tượng Recordset và Connection. Nếu ta gán thuộc tính CursorLocation của đối tượng Connection, tất cả recordset mà ta tạo từ kết nối đĩ đều cĩ cùng vị trí con trỏ như đối tượng Connection.
Ngồi việc chỉ ra vị trí con trỏ, ta cĩ khả năng tạo 4 kiểu con trỏ khác nhau trong ADO. Việc chọn lựa con trỏ tuỳ theo sự cân đối giữa chức năng và khả năng hoạt động.
Chỉ ra kiểu con trỏ bằng cách gán thuộc tính CursorType của đối tượng recordset. Sau đây là các kiểu con trỏ cĩ thể tạo trong ADO:
Kiểu con trỏ Hằng Mơ tả
Forward - only adOpenForwardOnly
Khơng dùng con trỏ, ta chỉ cĩ thể chuyển về phía trước trong Recordset, sử dụng phương thức MovePrevious và Movefirst sẽ sinh lỗi. Keyset (Trong DAO được gọi là Dynaset)
AdOpenKeyset
Ta khơng thể thấy các mẫu tin mới do những người sử dụng khác thêm vào, nhưng khi họ sữa đổi, hay xĩa mẫu tin sẽ làm ảnh
hưởng đến
Recordset ta đang làm việc, đây là kiểu con trỏ hiệu quả nhất, đặc biệt là Recordset khá lớn.
Dynamic adOpenDynamic
Ta cĩ thể thấy tồn bộ thay đổi trên dữ liệu do những người sử dụng khác thực
Luan van tot nghiep Trang 80
hiện trong khi ta đang mở Recordset, đây là kiểu con trỏ ít hiệu quả nhất, nhưng mạnh mẽ. Static (Trong DAO gọi là Snapshot) adOpenStatic Bản sao của tồn bộ dữ liệu của một Recordset, kiểu này đặc biệt hữu dụng khi ta đang tìm kiếm dữ liệu hay thi hành báo cáo, kiểu con trỏ này rất hữu dụng cho những Recordset nhỏ.
Nếu ta chỉ hiển thị dữ liệu chứa trong cơ sở dữ liệu thì con trỏ kiểu Forward – only sẽ làm khả năng hoạt động của ứng dụng trở nên hiệu quả hơn.
* Xác định con trỏ và các tính năng khác được hỗ trợ bởi một trình cung cấp:
Bởi vì OLE DB và ADO được thiết kế để cho phép truy cập đến nhiều nguồn dữ liệu, ứng dụng cần xác định các tính năng do một trình cung cấp nhất định hỗ trợ. Cĩ thể là trong khi một hệ cơ sở dữ liệu quan hệ cho phép tạo con trỏ kiểu Forward – only ở phía server, hệ cơ sở dữ liệu trên máy cá nhân hoặc cơ sở dữ liệu dựa trên tập tin cĩ thể khơng cĩ tính năng này.
Phương thức Supports của đối tượng ADO Recordset xác định kiểu con trỏ do trình cung cấp dữ liệu hỗ trợ.
Bảng sau đây liêtk kê các giá trị truyền vào phương thức Supports để xác định tính năng được hổ trợ bởi đối tượng Recordset:
Hằng Mơ tả
adAddNew Thêm mẩu tin mới vào Recordset.
adApproxPosition
Thuộc tính SbsolutePage và
AbsolutePosition cĩ sẵn, chúng được dùng để kết hợp với thuộc tính PageSizi và PageCount của đối tượng Recordset để cho phép xác định trang chứa mẩu tin hiện
Luan van tot nghiep Trang 81
hành.
adBookmark Cĩ thể quy định đánh dấu trang sách trong Recordset.
adDelete Mẩu tin được xĩa trong Recordset. adHoldRecords
Mẩu tin được trả về từ cơ sở dữ liệu mà khơng cần ghi các sữa đổi hiện cĩ vào server.
adMovePrevious Cĩ thể cuộn tới lui trong Recordset. adResync Phương thức Resync cĩ sẵn.
adUpdate Recordset cập nhật được.
adUpdateBatch
Recordset cĩ thể cập nhật được hàng loạt với phương thức UpdateBatch. Ta cĩ thể nạp các sữa đổi trên nhiều mẩu tin trong một hoạt động duy nhất, cải tiến hiệu quả Client/ Server
5. Khĩa mẩu tin trong ADO:
Tương tự các mơ hình đối tượng truy cập cơ sở dữ liệu khác, ADO cho phép quy định các kiểu khĩa mẩu tin khác nhau. Ta dùng tính năng này khi cần kiểm sốt cách thức cập nhật các mẩu tin với nhiều người sử dụng trong cơ sở dữ liệu.
Quy định chế độ khĩa cho đối tượng Recordset của ADO thơng qua thuộc tính LockType. Dưới đây là danh sách 4 kiểu khĩa mẩu tin:
Hằng Mơ tả
adLockReadOnly Cấm cập nhật mẩu tin
adLockPessimistic
Khĩa trang bi quan. Mẩu tin trong Recordset bị khĩa khi bắt đầu sữa đổi, và tiếp tục khĩa đến khi thi hành phương thức Update hay di chuyển sang mẩu tin khác.
adLockOptimistic
Khĩa trang lạc quan. Mẩu tin chỉ bị khĩa ngay lúc thi hành phương thức Update hay di chuyển sang mẩu tin khác.
adLockBatchOptimistic Khĩa trang lạc quan hàng loạt. Hỗ trợ cập nhật nhiều mẩu tin cùng lúc.
Điểm quan trọng cần lưu ý là phương thức khĩa mặc định trong ADO là adLockReadOnly. Đây là một trong những điểm khác biệt đáng kể giữa
Luan van tot nghiep Trang 82
lập trình ADO và DAO, vì trong DAO, bởi mặc định Recordset được phép sữa đổi. Điều này cĩ nghĩa là nếu ta khơng đổi thuộc tính LockType và CursorType thì các recordset của ADO sẽ luơn là chỉ đọc.
Sự hiện diện của các kiểu khĩa mẩu tin tùy thuộc vào những gì trình cung cấp dữ liệu hỗ trợ. Ta cĩ thể dùng phương thức Supports của đối tượng Recordset để xác định trình cung cấp cĩ hỗ trợ kiểu khĩa mẩu tin hay khơng.
6. Mở và đĩng kết nối đến nguồn dữ liệu:
Để phát yêu cầu đến nguồn dữ liệu dùng ADO, ta mở kết nối đến nguồn dữ liệu đĩ. Ta dùng phương thức Open của đối tượng Connection. Khi hồn tất các nguồn dữ liệu, ta đĩng nĩ bằng phương thức Close của đối tượng Connection.
Cú pháp: cn.Open [connect], [userid], [password]
Tồn bộ tham số của Open đều là tuỳ chọn, nếu khơng cung cấp chuỗi kết nối trong tham số của phương thức Open ta cĩ thể cung cấp nĩ với thuộc tính ConnectionString của đối tượng Connection. Hiệu quả như nhau.
Cú pháp của chuỗi kết nối thay đổi tuỳ theo trình cung cấp dữ liệu. Khi đã hồn tất với đối tượng Connection của ADO, ta nên luơn luơn đĩng nĩ bằng phương thức Close.
Cú pháp: cn.Close
Đĩng kết nối một cách tường minh bảo đảm rằng tài nguyên bất kỳ liên quan với kết nối này đều được nhả đúng quy ước.
7. sử dụng đối tượng Recordset của ADO để thao tác với dữ liệu:
Đối tượng Recordset của ADO tương tự Recordset của DAO và rdoResultset của RDO, là phương pháp truy cập thơng tin được trả về từ trình cung cấp dữ liệu. Recordset của ADO cĩ nhiều thuộc tính và phương thức trùng với Recordset của các mơ hình khác, vì thế cĩ thể làm việc với chúng tương tự các Recordset khác.
Thủ tục Recordset của ADO tương tự rdoResultset của RDO. Tuy nhiên ADO thêm một thay đổi lý thú: khả năng tạo đối tượng Recordset khơng địi hỏi một đối tượng Connection ngầm.
Chuỗi lệnh tạo Recordset của ADO cĩ thể là tên bảng, tên truy vấn hay câu lệnh SQL (nĩ hoạt động tương tự phương thức OpenRecordset trong DAO).
Kỹ thuật này tiện dụng trong trường hợp ta khơng cần kết nối thường xuyên đến cơ sở dữ liệu, ta chỉ vào, lấy dữ liệu và trở ra. Nếu ứng dụng muốn cĩ kết nối thường xuyên với cơ sở dữ liệu, ta nên mở và duy trì một
Luan van tot nghiep Trang 83
đối tượng Connection. Tốt nhất nên giữ kết nối được mở liên tục đến cơ sở dữ liệu thay vì lặp đi lặp lại việc mở và đĩng.
Ta cĩ thể dùng đối tượng Recordset để cập nhật và thêm mẩu tin mới:
a. Thêm mẩu tin mới:
Các bước thực hiện: B1: Mở Recordset
B2: Thi hành phương thức AddNew
B3: Gán giá trị các trường trong đối tượng Recordset
B3: Lưu mẩu tin bằng cách thi hành phương thức Update của đối tượng Recordset.
b. Cập nhật mẩu tin:
Các bước thực hiện: B1: Mở Recordset
B2:Gán giá trị các trường trong đối tượng Recordset (ta khơng cần thi hành phương thức edit của đối tượng Recordset như ta thực hiện với DAO, ADO khơng làm như thế).
B3: Lưu mẩu tin bằng cách thi hành phương thức Update của đối tượng Recordset.
8. Tạo Recordset ngắt kết nối:
Khi dùng thư viện con trỏ phía Client của ADO, ta cĩ khả năng ngắt kết nối với server và tiếp tục làm việc với dữ liệu. Cách này làm cho ứng dụng trở nên linh hoạt, bởi vì nhiều người sử dụng cĩ thể làm việc với dữ liệu nếu họ khơng cần kết nối với server tại một thời điểm.
Để ngắt kết nối với server trong ADO ta quy định thuộc tính ActiveConnection của đối tượng Recordset là nothing. Client sẽ tiếp tục làm việc với dữ liệu thậm chí khi nĩ khơng kết nối với server.
a. Thi hành một truy vấn sử dụng các đối tượng Command và Parameter của ADO:
Sau khi kết nối thành cơng với nguồn dữ liệu thơng qua đối tượng Connection, ta bắt đầu phát các lệnh trên kết nối đĩ. Ta dùng đối tượng Command của ADO.
Trong các ví dụ trước, ta chỉ dùng đối tượng Connection và Recordset, khơng dùng Command. Nĩi chung ta dùng đối tượng Command khi ta muốn thi hành một thủ tục chứa sẵn (stored procedure) hay ta cần phát một truy vấn cĩ tham số.
b. Dùng đối tượng Field của ADO để truy cập dữ liệu của Recordset:
Dùng đối tượng Field và tập hợp Fields khi ta cĩ một đối tượng Recordset của ADO và ta muốn đọc hay sữa đổi giá trị trong trường dữ
Luan van tot nghiep Trang 84
liệu của mẩu tin hiện hành. Kỹ thuật này gần như đồng nhất với tập hợp cùng tên trong DAO và RDO.
Nĩi chung, nếu đã quen thuộc với việc truy cập trường dữ liệu trong đối tượng Recordset của DAO ta sẽ thấy ở đây khơng cĩ gì khác.
c. Dùng tập hợp Errors của ADO để xử lý lỗi:
Trong ADO hay các mơ hình đối tượng truy cập cơ sở dữ liệu khác, một số lỗi cĩ thể xảy ra.
Trong Visual Basic, một lỗi phát sinh khi ADO bắt gặp lỗi. Tương tự DAO và RDO ta cĩ thể lặp xuyên qua tập hợp Errors để hiển thị hay xử lý trên các thơng báo lỗi được phát sinh giữa Client và Server.
d. Sử dụng tập hợp Properties của ADO để kiểm tra các thuộc tính đặc biệt của một trình cung cấp:
Ngồi các đối tượng và thuộc tính quy ước, DAO cung cấp tập hợp Properties mở rộng cĩ thể được gán cho từng đối tượng trong mơ hình đối tượng. Tương tự, ADO cũng cung cấp tập hợp này, nhưng với sự khác biệt quan trọng, các đối tượng Properties của ADO khơng thể được tạo ra hay sữa đổi bởi ứng dụng. Thay vào đĩ, chúng chịu sự điều khiển của trình cung cấp dữ liệu.
Với trình cung cấp ODBC cho OLE DB, số thuộc tính của trình cung cấp được mở rộng rất nhiều. Nhớ rằng kiểu và giá trị của các thuộc tính này thay đổi tuỳ theo trình cung cấp.
V. TRUY VẤN CƠ SỞ DỮ LIỆU: 1. Câu truy vấn là gì? 1. Câu truy vấn là gì?
Là một lệnh cơ sở dữ liệu để lấy về các mẫu tin. Sử dụng các câu truy vấn ta cĩ thể lấy dữ liệu từ một hoặc nhiều trường trong một hay nhiều bảng. Ta cịn cĩ thể ép các dữ liệu lấy về theo một hợac nhiều ràng buộc, gọi là các tiêu chí, để hạn chế số lượng dữ liệu lấy về.
Các câu truy vấn trong Visual Basic chủ yếu dựa trên SQL, SQL là ngơn ngữ khá chuẩn để lấy về dữ liệu hoặc là thao tác với cơ sở dữ liệu.
Trong Visual Basic 6.0, ta khơng bị hạn chế vào việc sử dụng SQL để tiến hành các câu truy vấn. Sử dụng các đối tượng dữ liệu ActiveX – ADO, nguồn dữ liệu cĩ thể biểu lộ các hoạt động của chúng thơng qua các ngơn ngữ truy vấn khác hơn là SQL.
Kiểm tra các câu truy vấn với cửa sổ DATA VIEW:
Để tạo một câu truy vấn bằng cách sử dụng cửa sổ Data View, ta theo các bước sau:
Luan van tot nghiep Trang 85
B2: Từ menu View của Visual Basic, chọn Data View Window. Cửa sổ Data View xuất hiện. Lưu ý rằng ta cĩ thể gắn cửa sổ Data View vào cạnh của cửa sổ Visual Basic, giống như cửa sổ Project Explorer và cửa sổ Properties.
Để truy vấn một nguồn dữ liệu, trước hết ta cần tạo một kết nối dữ liệu. Một kết nối dữ liệu cung cấp thơng tin về cách thức kết nối với nguồn dữ liệu. Các bước tạo một kết nối dữ liệu:
B1: Trong cửa sổ Data View, nhấn nút phải chuột lên cửa sổ Data Link.
B2: Từ menu bật ra, chọn a Add Link. Hộp thoại Data Link Properties xuất hiện.
B3: Chọn một cơ sở dữ liệu để kết nối sau đĩ nhấn nút Next. B4: Trang connection xuất hiện. Chọn một cơ sở dữ liệu bằng
cách nhấn vào nút ở bên phải hộp văn bản cĩ nhãn “Select or enter a database name”.
B5: Sau khi chọn một cơ sở dữ liệu, nhấn nút Test Connection. Ta phải nhận được một hộp thơng điệp chỉ định rằng cơ sở dữ liệu đã được mở.
B6: Nhấn OK. Một kết nối dữ liệu mới đến cơ sở dữ liệu hiện ra, gõ tên cho kết nối dữ liệu mới.
Kết nối dữ liệu tồn tại trong mơi trường thiết kế Visual Basic cho đến khi ta huỷ nĩ. Nĩ khơng gắn với bất kỳ đề án Visual Basic nào và luơn luơn xuất hiện mỗi khi ta sử dụng Visual Basic. Điều này rất thuận tiện nếu ta cần viết nhiều ứng dụng trên cùng một cơ sở dữ liệu.
Bây giờ sau khi tạo xong một kết nối dữ liệu, ta cĩ thể tạo một câu truy vấn SQL trên cơ sở dữ liệu. Nhưng để làm được điều này, ta cần tạo một thiết kế Data Environment theo các bước sau:
B1: Từ cửa sổ Project, chọn Add Data Environment. B2: Thiết kế Data Environment mới xuất hiện.
B3: nhấn và rê bảng tblcustomer từ cửa sổ Data View vào thiết kế Data Environment. Một kết nối mới xuất hiện chứa bảng này.
B4: Trong thiết kế Data Environment, nhấn nút phải chuột lên bảng. Từ cửa sổ bật ra chọn Properties.
B5: Hộp thoại Table Properties xuất hiện. Nhấn SQL Statement. B6: Nhấn nút SQL Builder. Cửa sổ Query Design hiện ra.
B7: Nhấn và rê bảng tblcustomer từ cửa sổ Data View vào phần trên của cửa sổ truy vấn.
Luan van tot nghiep Trang 86
B8: Nhấn và rê các cột FirstName, LastName và Address từ bảng vào lưới của cửa sổ truy vấn. Ta cĩ thể thấy truy vấn SQL được thiết lập khi ta rê các trường vào lưới.
B9: Từ menu Query của Visual Basic chọn Run.
a. Sử dụng cửa sổ Data View để tạo các câu truy vấn phía Server:
Nếu nguồn dữ liệu là Microsoft SQL Server, ta cĩ thể tạo một câu truy vấn phía Server, gọi là View, bằng cách sử dụng cửa sổ Data View. Các câu truy vấn thuộc loại này dễ quản lý và cĩ thể thi hành nhanh hơn các câu truy vấn phía Client.
Để tạo một View bằng cách sử dụng cửa sổ Data View, ta theo bác bước sau:
B1: Tạo một kết nối dữ liệu đến một cơ sở dữ liệu SQL Server ( bằng cách sử dụng thủ tục trình bày trong phần trước).
B2: Nhấn vào dấu cộng bên trái của tên kết nối dữ liệu để hiển thị các danh mục đối tượng của nĩ (cĩ bốn danh mục).
B3: Nhấn nút phải chuột vào danh mục Views. Từ cửa sổ bật ra chọn New View.
B4: Cửa sổ New View hiện ra.
B5: Nhấn và rê bảng tblcustomer từ cửa sổ Data View vào cửa sổ New View. Cửa sổ truy vấn đã thay đổi để phản ánh sự thêm vào.
B6: Để chỉ ra rằng ta muốn xem tất cả các cột trong bảng tblcustomer, rê mục “All Columns” từ bảng vào lưới cột. Dữ