0

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

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

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

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

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

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

谢谢,

格雷格

4

2 回答 2

1

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

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

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

于 2013-11-15T02:33:32.537 回答
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”。

于 2013-11-15T11:52:34.763 回答