Chào các bạn,
Đối với vấn đề tự động kiểm tra kết nối của Linked Table có rất nhiều cách tiếp cận. Lần này tôi cũng có một demo chia sẻ với các bạn về vấn đề trên.
Như phần 1 demo của Mod
maidinhdan đã giới thiệu với các bạn, đây là hướng dẫn cách cơ bản nhất để các bạn có thể theo thủ thuật đó mà phát triển thêm cho các ứng dụng thực tế của các bạn.
Lần này demo của tôi sẽ đi theo hướng chi tiết vào qui trình xử lý (luồng thao tác) thực tế của ứng dụng.
Thông thường thì khi ứng dụng khởi động sẽ chạy cái form Splash màu mè để giới thiệu sản phẩm hoặc form đăng nhập thẳng luôn. Khi đó mình sẽ dùng cái form Splash (hoặc Macro Autoexec) để kích hoạt thủ tục/ hàm kiểm tra các đường link tới CSDL Backend có còn hiệu lực không và tái kết nối nếu có vấn đề phát sinh. Để làm được điều này thì tôi dùng 1 table lưu các đường dẫn tới các file BE (đã kết nối thành công ở lần trước) và file này luôn nằm (đi theo) trong file FE và là "local table" chứ không phải "linked table".
- Hàm sẽ kiểm tra kết nối thử tới các database này, nếu thành công thì vô thẳng form đăng nhập và sử dụng.
- Nếu kết nối không được sẽ hiện bảng để bạn chọn lại đường dẫn database BE. Sau đó sẽ xoá các linked table hiện hữu và tạo link mới từ đường dẫn file BE vừa cung cấp.
Việc kiểm tra xem đường dẫn tới file có còn "nằm đúng chỗ" hay không thì tôi hay dùng hàm Dir() hàm này rất nhanh nhưng hàm này chưa đủ trong việc xác định Linked table hiện tại có thể kết nối được với database BE đó hay không do có đặt mật khẩu database. Có nhiều trường hợp lúc đầu không đặt mật khẩu, sau này suy nghĩ lại và đặt mật khẩu cho BE hoặc thay đổi mật khẩu mới. Khi đó bắt buộc bạn phải xoá hết Linked table cũ và Import Link lại với BE mới có mật khẩu (nếu linked table lần trước đã link với BE có mật khẩu rồi thì không cần xoá table). Chuỗi kết nối (tdf.Connect) sẽ khác nhau. Khi đó hàm Dir() cho bạn biết file BE còn nằm đúng chỗ nhưng linked table kết nối vô sẽ báo lỗi sai password.
Để tránh trường hợp này thì tôi dùng cách mở thẳng cái BE đó với mật khẩu cũ, nếu báo lỗi sẽ hiện form để cập nhât lại đường dẫn + password.
Mã PHP:
On Error GoTo ErrHandler
Set db = DBEngine.OpenDatabase(strDatabasePath, False, True, "MS Access;PWD=" & strPassword)
Sau khi cung cấp đường dẫn và mật khẩu hợp lệ cho database BE, sẽ tiến hành xoá Linked table cũ và nạp lại Linked table mới.
Tôi có dùng thử lệnh xoá: Docmd.DeleteObject nhưng thấy nó chậm và phát sinh một lỗi không hiểu đó là nó xoá không hết table (Không biết do lỗi Access hay sao nhưng đã cài lại Access vẫn bị).
Mã PHP:
For Each tdfI In dbs.TableDefs
If Len(tdfI.Connect) > 0 Then
If tdfI.Connect Like "*;DATABASE=*" Then 'Chi xóa link cua Access database
On Error Resume Next '* Khong có dòng này, se không xóa hêt tdf
dbs.TableDefs.Delete tdfI.Name
End If
End If
Next tdfI
Tôi thêm điều kiện
: Like "*;DATABASE=*" để chỉ xoá các Linked table của Database Access thôi. Có nhiều ứng dụng có link với Excel và CSDL khác nên không đụng tới các link này.
Sau khi xoá Linked table sẽ tạo link mới tới file BE hợp lệ. Tôi cũng có test thử việc tạo link table mới bằng lênh:
Docmd.TransferTransferDatabase acLink... nhưng cũng thấy chậm hơn so với dùng TableDef.
Mã PHP:
Set tdfI = dbs.CreateTableDef(strTableName)
tdfI.Connect = conn
tdfI.SourceTableName = strTableName
dbs.TableDefs.Append tdfI
Sau khi đã link lại toàn bộ table của các database BE thì tôi dùng code để mở kết nối liên tục tới các BE nhằm tăng tốc độ truy vấn các table. Phần này tôi đã có nói trong bài trước. Các bạn xem link ở đây.
Link: https://thuthuataccess.com/forum/thread-11157.html
Vậy là xong việc kết nối lại với các Linked table. Code để thực hiện kết nối thì không có gì khó, chủ yếu khó là bẫy lỗi các vấn để có thể phát sịnh trong quá trình thao tác, sử dụng ứng dụng.
Trong demo tôi có làm sẳn một macro "AutoExec1", nếu bạn nào không dùng form Splash thì sửa thành "AutoExec" để Access tự chạy macro này khi khởi động ứng dụng, kiểm tra Linked table.
Dưới đây là link file demo, các bạn test xem thử nhé.
Link demo: https://drive.google.com/open?id=1oOl9WixCXssN59cldcAvHikSV0qXgAGk