【问题标题】:Access 2007 VBA: Set Tabledef.Connect property to invalid pathAccess 2007 VBA:将 Tabledef.Connect 属性设置为无效路径
【发布时间】:2013-11-15 19:52:34
【问题描述】:

有人要求我对 Access 2007 VBA 数据库进行一些维护。

它已将表链接到同一文件夹中的另一个 Access 数据库。它具有指向该数据库的硬编码链接,因此如果用户将文件夹复制到新文件夹,它会尝试使用原始文件夹中的链接数据库。他们要求我消除在这种情况下使用错误链接数据库的危险。

我添加了在打开数据库时运行的代码,以使其在其自己的文件夹中重置指向数据库的链接。如果链接的数据库不存在或已重命名,则会提示用户浏览到正确的数据库。到目前为止一切顺利。

但如果用户取消该对话框,我不想让它连接到错误的数据库。即使表不存在,我也想将链接的 tabledef 的 Connect 属性设置为“正确”路径。然后用户将收到一个错误,即链接表不存在,直到他们复制到链接数据库中——而不是无意中使用了错误的数据库。

当我使用 Resume Next 来解决在将 Connect 属性设置为不存在的数据库时引发的错误时,更改不会保留,而是连接到错误的数据库。所以现在,我在发生这种情况时关闭数据库(在提醒用户无法找到链接数据库之后)。就不使用错误的数据库而言,这是安全的,但我认为这不是理想的用户体验。

那么——是否可以将 Tabledef 的 Connect 属性设置为不存在的数据库?

谢谢,

格雷格

【问题讨论】:

  • 您可以将链接数据库的路径存储在一个表中,并在打开数据库时检查它是否与 currentproject.path 相同。

标签: ms-access ms-access-2007 vba


【解决方案1】:

是否可以将 Tabledef 的 Connect 属性设置为不存在的数据库?

我不这么认为。我建议您先删除所有链接表,然后如果没有要连接的数据库,则显示错误。

为了重新链接这些表,您需要在前端文件中有一个本地表,其中包含要链接的所有表的列表。然后,每次需要重新链接表时,您都需要遍历该列表,假设链接已全部删除。

【讨论】:

    【解决方案2】:

    为了更新表格链接以使其无效,您需要

    • 创建后端数据库的临时副本(或者可能是带有空表的“骨架”后端数据库的临时副本),
    • 更新表链接指向临时数据库,然后
    • 删除临时数据库。

    例如,如果我运行以下代码

    Option Compare Database
    Option Explicit
    
    Sub MakeBadLink()
        Const linkedTableName = "myLinkedTable"  ' test value
        Dim cdb As DAO.Database, tbd As DAO.TableDef
        Dim tempFolder As String, linkedDb As String, tempDb As String
        Dim fso As FileSystemObject
        Set cdb = CurrentDb
        linkedDb = Mid(cdb.TableDefs(linkedTableName).Connect, 11)  ' remove ";DATABASE=" prefix
        Set fso = New FileSystemObject
        tempFolder = fso.GetSpecialFolder(TemporaryFolder) & "\"
        tempDb = tempFolder & fso.GetFileName(linkedDb)
        fso.CopyFile linkedDb, tempDb, True
        Set tbd = cdb.TableDefs(linkedTableName)
        tbd.Connect = ";DATABASE=" & tempDb
        tbd.RefreshLink
        Set tbd = Nothing
        Set cdb = Nothing
        fso.DeleteFile tempDb
        Set fso = Nothing
    End Sub
    

    然后任何后续尝试使用 [myLinkedTable] 都会导致错误

    找不到文件 `C:\Users\Gord\AppData\Local\Temp\myDb.accdb'。

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2013-11-15
      相关资源
      最近更新 更多