ms-access - 需要使用用户名、密码和系统 DB 更改 MS Access DB 中的链接表
问题描述
我有一个前端数据库,它需要链接到不同的后端数据库。为了让您了解,它与独立的 MDB 文件有关。有问题的软件为每个公司建立一个数据库。
目前我正在这些 MDB 文件之一中编写代码。
为了可扩展性,我现在正在创建一个新的数据库,它将通过代码链接到每个 MDB,因此我的问题如下
如何通过代码/VB更改链接表位置,以便用户可以选择他们想要工作的公司/数据库
我如何通过传递对所有公司/数据库都相同的用户名和密码来做到这一点
如下所示,我们需要通过 systemDB 验证用户名和密码才能成功打开。
作为仅供参考,这就是我们独立打开数据库的方式 -“C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE”“C:\temp\SAMPLE.mdb”/WRKGRP“ C:\ProgramData\SOFTWARE\SYSTEM.mdw" /user:username /pwd:password
解决方案
这根本不是问题,并且在明确说明您使用的是单个 MDW 文件的情况下绝对可以完成。
澄清 Microsoft Access 工作组安全本质上是一种“会话”安全模型,在您打开它时直接应用于前端 MDB 文件。
您的示例命令行意味着 Microsoft Access 将SAMPLE.MDB
使用您指定的工作组文件打开前端文件。
在该工作组文件下打开 Microsoft AccessSAMPLE.MDB
后,如果不关闭 Microsoft Access 并在新的工作组文件下重新打开,就无法更改到该“会话”中的另一个工作组文件。
仅供参考 - 可以通过代码打开另一个 MDB 中的表,使用该连接中的另一个工作组文件,但以这种方式,该表只能在代码中用作 RecordSet(例如),你不能让它成为链接表。
无论如何,回到你真正的问题。如何为每个公司链接不同的后端表集。
我的建议是在Company
表中添加一些字段,用于定义每个后端文件的文件名和位置。例如:
请注意,该位置可以是 UNC 路径,也可以是映射的驱动器路径。或者,您可能不需要在表中明确定义位置。也许所有的后端都在同一个文件夹中,或者在一个可定义的动态位置,如\Dallas\Dallas.mdb
,\NewYork\NewYork.mdb
等。只要你能以某种方式确定每个后端的位置,那么你就可以了。
现在,由于您可能会有“全局”前端表,可能还有一些“全局”链接的后端表i.e. Common.mdb
,以及您公司特定的后端表,我建议您使用定义名称的前端表仅在公司特定文件中涉及的每个表。这样,我们可以轻松地遍历这些表名并更改链接。
对于链接代码,假设您已经提示用户他们想要哪个公司,并且您将 传递CompanyID
给重新链接函数:
Public Function ChangeCompanyLinks(CompanyID As Long) As Boolean
Dim db As DAO.Database
Dim ldb As DAO.Database
Dim tdf As DAO.TableDef
Dim rstCompany As DAO.Recordset
Dim rstTables As DAO.Recordset
Dim mssql As String
Dim dbFullPath As String
Dim retVal As Boolean
Set db = CurrentDb()
retVal = False
mssql = "SELECT * FROM [tblCompany] WHERE [CompanyID] = " & CompanyID
Set rstCompany = db.OpenRecordset(mssql, dbOpenSnapshot)
If Not rstCompany.BOF Then
dbFullPath = rstCompany("DBLocation") & "\" & rstCompany("DBName")
If Dir(dbFullPath) = rstCompany("DBName") Then
'NOTE: By opening a temporary constant link to the back-end during
' relinking, the relinking runs faster
Set ldb = OpenDatabase(dbFullPath)
mssql = "SELECT * FROM [tblLinkedTables] WHERE [FileType] = ""Company"""
Set rstTables = db.OpenRecordset(mssql, dbOpenSnapshot)
Do While Not rstTables.EOF
Set tdf = db.TableDefs(rstTables("TableName"))
tdf.Connect = ";DATABASE=" & dbFullPath
tdf.RefreshLink
rstTables.MoveNext
Loop
rstTables.Close
ldb.Close
retVal = True
Else
MsgBox "Unable to Locate Company File"
End If
End If
rstCompany.Close
ChangeCompanyLinks = retVal
Set rstCompany = Nothing
Set rstTables = Nothing
Set ldb = Nothing
Set tdf = Nothing
db.Close
Set db = Nothing
End Function
显然,您将希望添加错误处理,并对其进行一些自定义以适应您的情况,但是此代码会将指定的表重新链接到新的后端。
请注意,如果您最终更改为在 SQL Server 中使用后端表(我强烈推荐),则需要稍微修改重新链接代码。有关详细信息,请参阅此答案。
推荐阅读
- r - 如何创建范围级别(例如 0-10、10-30、30-100 等)并使用 R 从一组数字中标记范围?
- ios - macOS、swift中如何获取位置坐标
- python - 如何从 Python 中的 Pandas 数据框创建嵌套的 JSON 文件?
- c++ - c ++ tic tac toe非int字符导致无限循环
- python - 子类化和 keras 的 Python 问题
- linux - OpenGL EGL eglGetDisplay 不断返回 EGL 错误 0x3008(EGL_BAD_DISPLAY)
- python-3.x - 绘制布朗运动实现的平均长度
- r - 如何在 R 中解压这个 jsonlite 返回值?
- php - 如何在 / 之后的 url 中获取用户名?
- javascript - JavaScript 日期格式显示错误