MS Access có chức năng link đến các bảng ở một cơ sở dữ liệu khác, việc này rất thuật tiện để các bạn có thể thực hiện việc quản lý CSDL dưới dạng Ứng dụng và CSDL riêng. Kết nối của Ứng dụng và CSDL sẽ thông qua các kết nối bảng trong chính Ứng dụng.
Theo cách này chúng ta có thể xây dựng một form login theo đó người dùng phải khai báo mật khẩu và tên người dùng. Sau khi nhập vào các thông tin này, chúng ta kích hoạt một thủ tục tạo kết nối với CSDL (có thể tạo mới hoặc refresh link nếu đã có sẵn kết nối). Nếu không thành công thì không cho sử dụng.
Về khoản này tôi gửi cho các bạn một đoạn mã nguồn thực hiện công việc tái tạo lại kết nối cho các liên kết bảng đến một csdl khác có mật khẩu nhé:
'1. Cách gọi hàm:
dbErr = RemapLinks(IIf(IsNull(txtPassword), "", txtPassword), dbPath)
' trong đó txtPassword là chuỗi mật khẩu, dbpath là đường dẫn đến file dữ liệu
' dbErr là biến trả lại lỗi kết nối nếu không thành công. Hàm remaplink sẽ thực hiện kiểm nghiệm các kết nối đã tồn tại trong Ứng dụng
'2. Thủ tục thực hiện công việc
Function RemapLinks(Optional PwdString As String = "", Optional tPath As String = "") As DatabaseErrors
' Thủ tục này sẽ thực hiện việc kiểm tra và khởi tạo lại kết nối dựa vào tên
' các liên kết đã có sẵn
' để dùng cái này, các bạn cần phải trỏ tham chiếu của ứng dụng vào DAO nhé
Dim tdf As Object, TblName As String
Err.Clear
On Error GoTo ErrHandler
For Each tdf In CurrentDb.TableDefs
If InStr(tdf.Connect, ";DATABASE") <> 0 Then
' Đây là một liên kết
If InStr(tdf.Name, "qry_") <> 0 Then
' Cái này không cần thiết - chỉ để kiểm tra cho mục đích của tớ thôi
Else
' Tạo lại chuỗi kết nối nhé - các bạn có thể dùng cách này để tạo ra một kết nối ...
tdf.Connect = "Ms Access;UID=Admin;PWD=" & PwdString & ";DATABASE=" & tPath
'TblName = tdf.Connect
' Làm tươi lại kết nối bằng cái này
tdf.RefreshLink
End If
End If
Next
Set tdf = Nothing
Exit Function
ErrHandler:
RemapLinks = Err.Number
'If Err.Number <> 0 Then WriteLog "RemarpLink", Err.Description
' this is my old code for logging error
End Function
Có gì các bạn cứ hỏi thêm nhé.