首页 > 解决方案 > 需要使用用户名、密码和系统 DB 更改 MS Access DB 中的链接表

问题描述

我有一个前端数据库,它需要链接到不同的后端数据库。为了让您了解,它与独立的 MDB 文件有关。有问题的软件为每个公司建立一个数据库。

目前我正在这些 MDB 文件之一中编写代码。

为了可扩展性,我现在正在创建一个新的数据库,它将通过代码链接到每个 MDB,因此我的问题如下

  1. 如何通过代码/VB更改链接表位置,以便用户可以选择他们想要工作的公司/数据库

  2. 我如何通过传递对所有公司/数据库都相同的用户名和密码来做到这一点

  3. 如下所示,我们需要通过 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

标签: ms-accessvbamdw

解决方案


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


推荐阅读