我有一些VBA,可以编程地更新链接表的位置,以便可以轻松地将数据库的前端指向不同的后端,而无需在链接表中单击经理。该技术在这篇Microsoft博客文章中进行了解释。这应该像CurrentDb.TableDefs
中的每个链接表:
tableDef.Connect = ";DATABASE=" & newBackEndPath
tableDef.RefreshLink
但是,当表包含多值字段时,访问提供以下无用且误导的错误消息:
运行时错误'3125':
'[表名称]'不是有效的名称。确保它不包括无效的字符或标点符号,并且不长。
手动更新链接表管理器的链接时出现相同的错误,尽管有时尝试了几次,但该更新将无需错误消息而起作用。为了解决问题,我正在尝试通过创建新的TableDef
来刷新链接,然后将其重命名在旧问题上:
Dim tdf As TableDef
Set tdf = CurrentDb.CreateTableDef(originalTableName & "_Copy")
tdf.Connect = ";DATABASE=" & newBackEndPath
tdf.SourceTableName = tableName
With CurrentDb.TableDefs
.Append tdf
.Refresh ' Required?
End With
RefreshDatabaseWindow ' Required?
DoEvents ' Required?
DoCmd.Rename originalTableNameName, acTable, originalTableNameName & "_Copy"
这通常有效,但有时DoCmd.Rename
会引发以下运行时错误:
运行时错误'7874':
Microsoft Access找不到对象'[表名称] _复制'。
如果我输入调试器,则通常会触发某种刷新,而_Copy
表显示在导航窗格中。如果此时我按F5,DoCmd.Rename
毫无问题地执行。显然,在将TableDef添加到实际找到和重命名之前,将其延迟一些延迟。我已经添加了TableDefs.Refresh
,RefreshDatabaseWindow
和DoEvents
行,以强迫新表格出现,但似乎没有帮助。即使强迫延迟几秒钟似乎行不通,但是以某种方式打开调试器。
是否有任何可靠的方法来刷新包含多价字段的链接表?
(我忽略了启动此项目时避免使用多值字段的建议,因为我希望用户能够在拆分表单datasheet上使用快速过滤器在多价值字段上过滤。此功能非常有用,但是我开始希望我在实现多价值字段的实现中遇到和许多其他错误之后刚刚构建了自己的过滤UI。(
您可以使用DoCmd.TransferDatabase
:
DoCmd.TransferDatabase acLink, "Microsoft Access", newBackEndPath, acTable, tableName, tableName
DoCmd.TransferDatabase
类似于使用GUI链接表。它处理步骤,例如为您刷新数据库窗格。我通常建议改用TableDefs
,但这种情况可能是一个例外。