需要使用用户名,密码和系统DB更改MS Access DB中的链接表

时间:2018-11-08 15:34:28

标签: vba ms-access access-vba mdw

我有一个前端数据库,它需要链接到不同的后端数据库。为了给您提供视角,它涉及独立的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:用户名/ pwd:password

1 个答案:

答案 0 :(得分:1)

这根本不是问题,并且只要您使用的是单个MDW文件,就可以完全实现。

为了弄清楚Microsoft Access Workgroup Security本质上是一个“会话”安全模型,当您打开它时,该模型直接应用于前端MDB文件。

您的示例命令行意味着Microsoft Access将使用您指定的工作组文件打开SAMPLE.MDB前端文件。

一旦Microsoft Access在该工作组文件下打开了SAMPLE.MDB,您就无法在该“会话”中更改为另一个工作组文件,而无需关闭Microsoft Access并在新的工作组文件下重新打开。

仅供参考-可以通过该连接中的另一个工作组文件通过代码打开另一个MDB中的表,但是以这种方式,该表只能在代码中用作RecordSet(例如),您不能使其成为链接表。

无论如何,回到您的真实问题。如何为每个公司链接不同的后端表集。

我的建议是在Company表中添加一些字段,以定义每个后端文件的文件名和位置。例如:

enter image description here

请注意,该位置可以是UNC路径,也可以是映射的驱动器路径。或者,也许您不需要在表中明确定义位置。也许所有后端都在同一个文件夹中,或者位于\Dallas\Dallas.mdb\NewYork\NewYork.mdb等可定义的动态位置。只要您可以某种方式确定每个后端的位置,那就很好。

现在,由于您可能会有“全局”前端表,也许还有一些“全局”链接的后端表i.e. Common.mdb,以及您公司特定的后端表,所以我建议您使用一个前端表,用于定义仅在公司特定文件中涉及的每个表的名称。这样,我们可以轻松地遍历这些表名并进行链接更改。

enter image description here

对于链接代码,假设您已经提示用户他们想要的公司,并且将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中使用后端表(我强烈建议这样做),则需要对重新链接代码进行一些修改。有关更多详细信息,请参见this answer