Access 2007 VBA:将Tabledef.Connect属性设置为无效路径

时间:2013-11-15 02:27:25

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

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

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

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

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

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

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

谢谢,

格雷格

2 个答案:

答案 0 :(得分:1)

  

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

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

为了重新链接表,您需要在前端文件中有一个本地表,其中包含要链接的所有表的列表。然后,每当你需要重新链接表时,你需要循环遍历该列表,假设链接都被删除了。

答案 1 :(得分:0)

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

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

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

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'。