【问题标题】:How can I refresh a linked table in VBA when it contains a multi-valued field?当 VBA 中包含多值字段时,如何刷新链接表?
【发布时间】:2018-04-25 04:12:50
【问题描述】:

我有一些 VBA 以编程方式更新链接表的位置,这样我的数据库前端就可以轻松指向不同的后端,而无需在链接表管理器中单击。该技术在this Microsoft blog post 中进行了解释。这应该就像为CurrentDb.TableDefs 中的每个链接表运行以下代码一样简单:

tableDef.Connect = ";DATABASE=" & newBackEndPath
tableDef.RefreshLink

但是,当表包含多值字段时,Access 会提供以下无用且具有误导性的错误消息:

运行时错误“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”。

如果我进入调试器,这通常会触发某种刷新,_Copy 表会出现在导航窗格中。如果此时按 F5,DoCmd.Rename 将毫无问题地执行。显然,在附加 TableDef 之后,在实际找到并重命名它之前会有一些延迟。我添加了TableDefs.RefreshRefreshDatabaseWindowDoEvents 行,试图强制新表出现,但它们似乎没有帮助。即使强制延迟几秒钟似乎也不起作用,但不知何故,打开调试器就可以了。

是否有任何可靠的方法来刷新包含多值字段的链接表?

(当我开始这个项目时,我忽略了对avoid using multi-valued fields 的建议,因为我希望用户能够使用拆分表单数据表上的快速过滤器来过滤多值字段。这个功能非常有用,但我在多值字段的实现中遇到这个和许多其他错误后,我开始希望我只是构建自己的过滤 UI。)

【问题讨论】:

  • 坦率地说,我会重新设计应用程序,而不是与这个错误功能的故障作斗争,这样可以节省时间。
  • 相信我,我已经考虑过了!但是要重现拆分形式的所有功能将是一项巨大的工作。我必须创建一个连续的表单,允许用户切换、重新排列、调整大小和过滤每一列。当需要用更强大的东西替换这个原型时,我打算放弃 Access 并构建一个合适的桌面应用程序。
  • 为什么需要重现拆分/数据表表单的功能?只需双击显示值列表的字段,即可使用弹出表单来编辑多个值。在这种情况下,您将比内置的多值字段编辑器具有更大的灵活性
  • 因为我想要这些功能!我的用户需要过滤数据表以查找具有“多值字段 A 具有值 J 或 K,多值字段 B 具有值 X 或 Y”之类的属性的行。快速过滤器使他们很容易做到这一点,并且在构建查询时查看中间结果。然后,他们可以在熟悉的 Excel 样式界面中隐藏不需要的列并更改列宽和顺序或行高。使用一系列子表单和弹出窗口很难重现这一点。
  • 我似乎已经解决了这个问题,解决了在运行OpenDatabase 以获取对后端的引用之后使用CurrentDb 来引用前端的问题。如果您偶然发现了这个问题,那么我认为问题与多值字段有关的假设实际上可能并不正确......

标签: ms-access linked-tables


【解决方案1】:

您可以使用DoCmd.TransferDatabase 尝试完全不同的方法:

DoCmd.TransferDatabase acLink, "Microsoft Access", newBackEndPath, acTable, tableName, tableName

DoCmd.TransferDatabase 类似于使用 GUI 链接表格。它为您处理刷新数据库窗格等步骤。我通常建议改用TableDefs,但这种情况可能是个例外。

当然,我支持 Sergey 的建议,不要使用多值字段。我很喜欢多值字段和相关组合框的用户体验,但使用 MVF 会产生深远的影响,比如将来无法将数据库迁移到 SQL Server

【讨论】:

  • 感谢您的建议!不幸的是,它有同样的问题——我应该在问题中提到我已经尝试过DoCmd.TransferDatabase。我会检查确切的错误消息,但不知何故,我的数据库已经(暂时)处于重新链接过程适用于任何方法的状态,所以我现在无法重现该问题。 Access 的乐趣!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
相关资源
最近更新 更多