Đối tượng dữ liệu ActiveX
Cho đến Visual basic 5.0, ADO (Dữ liệu đối tượng ActivateX - ActivateX Data Object) trở thành nền tảng của ký thuật truy cập dữ liệu Internet. Trong Visual basic 6.0, ADO 2.0 cang quan trọng hơn - mạnh mẽ hơn. Ta có thể dùng ADO không chỉ để truy cập cơ sở ...
Cho đến Visual basic 5.0, ADO (Dữ liệu đối tượng ActivateX - ActivateX Data Object) trở thành nền tảng của ký thuật truy cập dữ liệu Internet. Trong Visual basic 6.0, ADO 2.0 cang quan trọng hơn - mạnh mẽ hơn. Ta có thể dùng ADO không chỉ để truy cập cơ sở dữ liệu thông qua trang web, mà còn có thể dùng nó để lấy dữ liệu từ ứng dụng viết bằng Visual basic. ADO là giao diện dựa trên đối tượng cho công nghệ dữ liệu mới nổi gọi là OLE DB.
OLE DB được thiết kế để thay thế ODBC như một phương thức truy cập dữ liệu. ODBC hiện thời là tiêu chuẩn phía Client sử dụng Windows rất phổ biến để truy cập dữ liệu quan hệ bởi vì nó thiết lập các Server cơ sở dữ liệu quan hệ càng tổng quát càng tốt đến các ứng dụng Client. OLE DB đi sâu hơn một bước, bằng cách làm cho tất cả nguồn dữ liệu trở thành tổng quát đối với ứng dụng Client.
ADO là công nghệ truy cập cơ sở dữ liệu hướng đối tượng tương tự như DAO và RDO.
ADO hiện nay được Microsoft xem là kỹ thuật để truy cập cơ sở dữ liệu từ Web server. Bởi vì ADO được cung cấp dưới dạng thư viện ActivateX Server (tương tự DAO và RDO), ta có thể thoải mái dùng ADO trong ứng dụng Visual basic. Trong thực tế, bằng nhiều cách, ta sẽ thấy rằng sử dụng ADO để làm việc với cơ sở dữ liệu Client/Server thì dễ hơn các kỹ thuật khác.
Tìm hiểu cấu trúc OLEDB / ADO
Phần lớn các nhà lập trình viên Visual basic không thao tác trực tiếp với OLE DB. Thay vào đó, họ lập tình với ADO, mô hình đối tượng cung cấp giao diện với OLE DB.
Sử dụng ADO và OLE DB để tăng cường truy cập thông tin trong một cơ sở dữ liệuTrình cung cấp OLE DB không nhiều như trình cung cấp ODBC nhưng số lượng này đã tăng lên đáng kể từ khi ADO 2.0 được phát hành vào năm 1998. Phiên bản này đã được đưa vào Visual basic 6.0 bao gồm các trình cung cấp cục bộ cho SQL Server, Oracle và Microsoft Jet/ access.
Có nhiều khả năng bạn có thể dùng ADO và OLE DB để đạt được nguồn dữ liệu quan hệ ngay khi không có trình cung cấp OLE DB cụ bộ. Bởi vì đã có một tình cung cấp OLE DB tổng quát cho cơ sở dữ liệu quan hệ ODBC.
Ta chỉ cần lập trình với phần giao diện Người sử dụng ở phía Client. Bởi vì việc truy cập dữ liệu trên cả trình duyệt Web và ứng dụng Visual basic được chuyển hết về phía ActivateX Server, ta có thể bảo đảm rằng logic chương trình luôn nhất quán, bất kể loại ứng dụng nào đang được dùng.
Sau đây là cấu trúc truy cập cơ sở dữ liệu ODBC dùng trình cung cấp ODBC OLE DB.
Cấu trúc này cho phép ta dùng thành phần lập trình ActivateX thông dụng trên cả trình duyệt Web và ứng dụng Client Visual basic.
Cài đặt và thiết lập tham chiếu đến ADO trong ứng dụng Visual basic
ADO được cài đặt như một phần của Visual basic 6.0 Phiên bản mới nhất của của ADO cho phép tải xuống miễn phí từ địa chỉ http://www.Microsoft.com/data/ado.
Sau khi cài đặt xong, ta bắt đầu sử dụng nó bằng cách thiết lập tham chiếu đến thư viện ADO trong ứng dụng Visual basic, tương tự khi ta thiết lập tham chiếu đến thư viện DAO hay RDO.
- Trong project Visual basic chọn references, hộp thoại references xuất hiện
- Chọn vào hộp đánh dấu “Microsoft ActivateX Data Objects 2.0 Library” rồi nhấn OK
Chú ý rằng khi tham chiếu ADO thì phải đảm bảo là không có tham chiếu đến thư viện “Microsoft ActivateX Data Objects 2.0 Recordset”. Đây là phiên bản loại nhẹ của thư viện ADO được thiết kế để sử dụng phía Client. Nó chỉ hỗ trợ Recordset và Field.Sử dụng ADO với các thư viện đối tượng truy cập dữ liệu khác
Nếu bạn tạo ứng dụng được thiết kế để sử dụng ADO kết hợp với thư viện đối tượng truy cập dữ liệu khác, như là DAO, cần phải phân biệt giữa, ví dụ như đối tượng RecordSet của DAO và Recordset của ADO. Chúng không thể đổi chỗ cho nhau được.
Nếu ta tham chiếu đến vừa ADO vừa DAO và khai báo một biến Recordset, làm thế nào để phân biệt Recordset của DAO hay ADO? Câu trả laời là thứ tự tham chiếu vào đề án. Nếu thêm tham chiếu đối tượng DAO trước thì Recordset là của DAO và ngược lại. Để tránh nhầm lẫn ta nên khai báo tường minh như sau: ADODB.Recorset Nếu không muốn tham chiếu trực tiếp đến thư viện đối tượng trong chương trình, ta có cách khác. Ta có thể kiểm soát thư viện đối tượng nao được truy cập mặc định bằng cách dùng giá trị mực ưu tiên trong hộp References.
Dùng đối tượng connection của ADO để kết nối với nguồn dữ liệu
Vị trí của đối tượng Connection trong mô hình của ADO:(Xem hình dưới):
Dùng phương thức Open của đối tượng Connection để thiết lập kết nối với nguồn dữ liệu. Để thông báo cho ADO cách nối với nguồn dữ liệu ta phải cung cấp thông tin dưới dạng chuối kết nối của ODBC. Ta dùng thuộc tính ConnectionString để thực hiện điều này. Ta còn có khả năng tuỳ chọn để chọn trình cung cấpnào sẽ được dùng bằng cách quy định giá trị thuộc tính Provider của đối tượng Connection.
Chỉ ra trình cung cấp OLE DB và chuỗi kết nối
Nếu không chỉ ra trình cung cấp, hoặc ta không dùng đối tượng Connection, ta sẽ có một trình cung cấp mặc định, là trình cung cấp ODBC, MSDASQL.
Thuộc tính Provider của đối tượng Connection là chuỗi ký tự chỉ ra kết nối mà trình cung cấp OLE DB sẽ dùng.
Dùng chuỗi kết nối trong ADO để cung cấp thông tin về cách thức kết nối với Server cơ sở dữ liệu. Khi ta dùng trình cung cấp ODBC cho OLE DB, chuỗi kết nối tương tự chuỗi kết nối ODBC. Điều này có nghĩa là thông tin chính xác được mong chờ bởi trình điều khiển ODBC có thể thay đổi tuỳ theo cách thực hiện. Đối với các trình cung cấp khác, chuỗi kết nối có thể có một cú pháp hoàn toàn khác.
Khi ta dùng trình cung cấp ODBC, thuộc tính ConnectionString có thể là một DSN (tên nguồn dữ liệu) hay nó là kết nối không có DSN. Đây là một ví dụ của một kết nối đến cơ sở dữ liệu dùng trình cung cấp ODBC với DSN:
Cn.Provider = “MSDASQL” Cn.ConnectionString = “DSN = Novelty;”
Sử dụng DSN trong chuỗi kết nối dĩ nhiên yêu cầu một DSN tên là Novelty phải thực sự tồn tại trên máy Client.
Trường hợp kết nối không có DSN:
Cn.Provider = “MSDASQL” Cn.ConnectionString = “DRIVER = {SQL Server}; DATABASE = Novelty; UID = sa ; PD = ;”
Kết nối này sẽ nối kết Server nhanh hơn bởi vì nó không cần đọc thông tin DSN từ bảng đăng ký của Windows. Tuy nhiên, nó kém linh hoạt vì nó gắn chặt thông tin với chương trình đã được biên dịch
Làm việc với con trỏ
Tương tự RDO và DAO, ADO hỗ trợ một số kiểu con trỏ. Ngoài việc cung cấp hỗ trợ duyệt qua từng bản ghi 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à OLE DB xử lý các hoạt động của con trỏ. Con trỏ 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 bản ghi 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.
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.
Ngoà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 Recordset; sử dụng phương thức MovePrevious và MoveFirst sẽ sinh lỗi. |
Keyset(TrongADO được gọi là dynaset) | adOpenKeyset | Ta không thể tháy các bản ghi mới dongười dùng khác thêm vào, nhưng khi họ sửa đổi hay xoá 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à khi Recordset khá lớn. |
Dynamic | adOpenDynamic | Ta có thể thấy toàn bộ thay đổi trên dữliệu do những người sử dụng khác thực 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(TrongDAO gọi là snapshot) | adOpenStatic | Bản sao của toàn bộ dữ liệu của mộtRecordset; kiểu này đặc biệt hữu dụng khi ta đang tìm kiếm dữ liệu hay khi thi hành báo cáo; kiểu con trỏ này rất hữu dụng cho các Recordset nhỏ. |
Dĩ nhiên, lý do để ta chọn con trỏ kiểu forward-only thay vì keyset hay dynamic là khả năng hoạt động của - nếu ta chỉ hiển thị dữ liệu chứa trong cơ sở dữ liệu – con trỏ kiểu forward-only sẽ làm khả năng hoạt động của ứng dụng hiệu quả hơn.
Lưu ý rằng, nếu trình cung cấp dữ liệu không thể tạo ra điều khiển con trỏ mà ta yêu cầu, nó sẽ tạo ra con trỏ mà nó có thể. Nói chung, nó sẽ không báo lỗi trừ phi ta cố thi hành một tác vụ nào đó vốn bị cấm đối với kiểu con trỏ.
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 forword-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ệt 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 bản ghi vào Recordset |
adApproxPosition | Thuộc tính AbsolutePage và AbsolutePosition có sẵn; chúng |
được dùng để kết hợp với thuộc tính Pagesize và PageCount của đối tượng Recordset để cho phép xác định trang chứa bản ghi hiện hành. | |
adBookmark | Có thể quy định đánh dấu trang sách trong Recordset |
adDelete | Bản ghi được xoá trong Recordset |
adHoldRecords | Bản ghi được trả về từ cơ sở dữ liệu mà không cần ghi sửa đổihiện có vào server. |
adMovePrevious | Có thể cuộn tới lui trong Recordset |
adResync | Phương thức này 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ứcUpdateBatch. 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 |
Khoá bản ghi 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 khoá bản ghi(Record - locking) khác nhau. Ta dùng tính năng này khi cần kiểm soát cách thức cập nhật các bản ghi với nhiều người sử dụng trong cơ sở dữ liệu.
Quy định chế độ khoá 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 khoá bản ghi.
Hằng | Mô tả |
adLockReadOnly | Cấm cập nhật bản ghi |
adLockPressimistic | Bản ghi trong Recordset bị khoá khi bắt đầu sửa đổi, vàtiếp tục bị khoá đến khi thi hành phương thức Update hay chuyển sang bản ghi khác. |
adlockOptimistic | Bản ghi bị khoá ngay khi thi hành phương thức Updatehay di chuyển sang bản ghi khác. |
adlockBatchOptimistic | Hỗ trợ cập nhật nhiều bản ghi cùng lúc. |
Điểm quan trọng cần lưu ý là phương thức khoá mặc định trong ADO là adLockReadOnly. Đây là một trong các điểm khác biệt đáng kể giữa lập trình ADO và DAO, vì trong DAO bởi mặ đị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, các Recordset của DAO luôn là chỉ đọc.
Sự hiện diện của các kiểu khoá bản ghi phụ 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 support của đối tượng Recordset để xác định trình cung cấp có hỗ trợ kiểu khoá bản ghi hay không.
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.
Vị trí của Recordset của ADO trong mô hình đối tượng ADO:
Thủ tục tạo Recordset cảu ADO tương tự tạo rdorseultset 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.
Dùng đối tượng Recordset để cập nhật và thêm bản ghi mới
Thêm mới và cập nhật bản ghi trong ADO hầu như tương tự như trong DAO.
Thêm mới bản ghi:
- Mở Recordset
- Thi hành phương thức AddNew
- Gán giá trị cho các trường đối tượng Recordset
- Lưu bản ghi bằng phương thức Update của Recordset
Cập nhật bản ghi:
- Mở Recordset
- Gán giá trị cho các trường trong Recordset
- Lưu bản ghi bằng thi hành phương thức Update
Tạo Recordset ngắt kết nối
Khi dùng 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 đến Server.
Để 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.
Dịch vụ dữ liệu từ xa (Remote Data Service - RDS) dùng để lấy các Recordset của ADO từ web server. Thư viên này đi kèm với ADO, chủ yếu cho phép ta dùng HTTP làm vận chuyển trên mạng cho ứng dụng cơ sở dữ liệu. Chủ yếu được dùng trong các ứng dụng trình duyệt web, nó cũng hoạt động tốt với các Client của Visual basic.
Lưu ý RDS có tên cũ là Nối dữ liệu nâng cao (Advance Data Connector) bạn có thể tìm hiểu thêm tại địa chỉ: http://www.Microsoft.com.data/ado/rds
Ta cũng có thể dùng đối tượng DataControl của RDS để lấy về một đối tượng Recordset của ADO trên Internet. Đối tượng này, được phục vụ từ một máy tính chạy với IIS 3.0(microsoft Internet Infomation Server) trở lên, có khả năng trả về đối tượng Recordset của ADO đến bất kỳ Client qua HTTP. Cách dễ nhất để minh hoạ cách dùng RDS là thi hành một truy vấn trên Web server dùng đối tượng DataControl của RDS.
- Tạo một đề án Standard EXE mới
- Trong menu Project Referances, lập một tham chiếu đến Microsoft
ActivateX Data Objects 2.0 Recordset Library
- Tạo một hộp văn bản, một nút lệnh, và một danh sách trên biểu mẫu.
- Đưa đoạn chương trình sau:
Option Explicit Private rdc As RDS.DataControl Private Sub cmdQuery_Click() Screen.MousePointer = vbHourglass Set rdc = New RDS.DataControl rdc.SQL = "select * from tblCustomer where state = 'IN'" rdc.ExecuteOptions = adcExecAsync rdc.Connect = "DSN=JetNovelty;" rdc.Server = "http://localhost/" rdc.Refresh While rdc.ReadyState = adcReadyStateLoaded ' busy DoEvents Wend Do Until rdc.Recordset.EOF With rdc.Recordset lstCustomer.AddItem.Fields("FirstName") & " " & _ .Fields("LastName") .MoveNext End With Loop Set rdc = Nothing Screen.MousePointer = vbNormal End Sub
Trong ví dụ này, server “localhost” được dùng. Đây là một cách gọi tắt của Web server chứa trên cùng một máy. Nó rất tiện dụng khi cần kiểm nghiệm chương trình.Vòng lặp While Wend dùng để chờ đáp ứng của server. Đây là tính năng bất đồng bộ của lênh gọi HTTP. Ta không thể chắc chắn mất bao nhiêu lâu thì server đáp ứng, vì vậy ta phải chờ.