【问题标题】:Relative table links in ms-accessms-access 中的相对表链接
【发布时间】:2024-01-04 15:32:01
【问题描述】:

我确定以前一定有人问过这个问题,但我找不到。

我可以在 Access 2003 中为链接表的位置设置相对路径吗?

另一个表也存储在一个 mdb 文件中。这些数据库有时会通过 odbc 或 oledb 连接,因此依赖于 Access 打开文件时触发的 vba 代码将不起作用。如果可能的话,我希望数据库的“拆分”对连接的程序不可见,而不是每次链接到正确的表时它们都必须检查。

由于 cmets 而编辑:

解释得更清楚;我关心的用例是一组相互关联的访问数据库,它们都位于同一个目录中。

如果将它们作为一个组复制,所有链接仍然有效,但在更新之前,它们将指向错误的数据。 如果我在 Access 中打开 mdb 文件,一个简单的 vba 宏可以检查并在需要时更新链接。问题在于,在当前设置中,与在 Access 中打开数据库相比,其他程序(通过 oledb/odbc)连接到数据库的频率要高得多

问题是:我是否需要在每次移动 mdb 文件时手动触发更新,或者是否有某种方法可以 A)使链接相对或 B)在建立连接时触发检查?

由于这样做的目的是拆分现有数据库,我不想修改连接程序来运行这些检查,除非确实有必要,因此提出了这个问题。

【问题讨论】:

  • @Cogwheel 你假设我有一个选择......
  • 如果您在访问中做任何复杂到需要这种安排的事情,那么您很可能不应该在访问中这样做。或者至少你可能想重新考虑你的设计。
  • True :P(我知道那种感觉)
  • 很奇怪。在您发表评论之前,我的回复结果如何?
  • Cogwheel,请详细解释您的评论。我可以向你保证,有很多人在 Access 中做更复杂的事情。

标签: ms-access odbc oledb


【解决方案1】:

这是一个非常有趣的问题!正如 Raj Moore 所建议的,当链接表时,路径变为绝对路径,因此选项 A(使链接相对)将不起作用。

关于选项 B,您必须自行拦截连接请求并运行必要的代码来重新链接表 - Access 中没有内置的工具可以让您开箱即用。即使您确实有时间拼凑代码来完成此操作,我认为您会发现在实践中,一旦您开始研究其工作方式的语义(例如,您是否重新链接每个请求?当第一个客户端运行查询时另一个客户端连接到数据库会发生什么?如果单个客户端打开到同一个 mdb 的多个连接会发生什么?)

正如您所提到的,您可以更改客户端应用程序以在启动时重新链接表,这会起作用,但您可能仍然需要考虑多个客户端尝试连接到同一个后端 mdb 文件的情况( s)。即使这不应该发生,它也很可能发生。要考虑的另一点是可维护性。跟随您的其他人是否知道客户端应用程序在启动时执行此重新链接这一事实并且知道当新用户到达时不要简单地将连接字符串信息从一台客户端 PC 复制到另一台客户端 PC?

我确信您将 mdb 拆分为两个文件是有充分理由的,但鉴于我们在此问题中使用的少量信息,我想知道拆分它们是否会提供足够的收益超过了这可能带来的潜在问题。

如果您必须拆分数据库,并在网络共享上维护这些生成的 mdb 文件的单独副本,我认为最安全的替代方法是编写一个 VBA 过程来重新链接数据库中的表,使用相对路径。当您将文件复制到新目录时,您只需执行一次该过程即可重新链接表。

【讨论】:

  • 感谢您的回复。不幸的是,拆分的原因是我需要存储的数据量将远远超过 Access 2003 的 2gb 限制。不幸的是,我没有选择使用升级 Access 或将数据存储在不同的解决方案中。我得出的结论和你一样,我想,我想做的事情是不可能的,当我复制文件时我必须手动重新链接。
【解决方案2】:

您可以使用相对路径来链接表,但在链接时相对路径会被评估并转换为绝对路径。

如果您想继续使用相对路径,您应该有一个AutoExec 宏,它会触发一个在运行时从您的相对路径链接表的过程。

这当然会增加您的启动时间。

【讨论】:

  • 我知道 AutoExec 技术,但不幸的是它对我目前的情况没有帮助(见问题)。这并不意味着有办法做我想做的事,只是我想在放弃之前至少检查一下......