这根本不是问题,并且在明确说明您使用的是单个 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 中使用后端表(我强烈推荐),则需要稍微修改重新链接代码。有关详细信息,请参阅此答案。