我被要求对Access 2007 VBA数据库进行一些维护。
它将表链接到同一文件夹中的另一个Access数据库。它具有到该数据库的硬编码链接,因此如果用户将文件夹复制到新文件夹,它会尝试使用原始文件夹中的链接数据库。他们要我消除在这种情况下使用错误的链接数据库的危险。
我添加了在打开数据库时运行的代码,以使其重置指向其自己文件夹中的数据库的链接。如果链接数据库不存在或已重命名,则会提示用户浏览到正确的数据库。到目前为止一切都很好。
但是如果用户取消该对话框,我不想让它连接到错误的数据库。我想将链接的tabledef的Connect属性设置为“正确的”路径,即使该表不存在。然后,用户将收到链接表不存在的错误,直到它们在链接数据库中复制 - 而不是无意中使用了错误的数据库。
当我使用Resume Next来解决当我将Connect属性设置为不存在的数据库时引发的错误,更改不会粘连,使其连接到错误的数据库。所以现在,当发生这种情况时我正在关闭数据库(在警告用户无法找到链接数据库之后)。这对于不使用错误的数据库是安全的,但我认为这不是理想的用户体验。
那么 - 是否可以将Tabledef的Connect属性设置为不存在的数据库?
谢谢,
格雷格
答案 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'。