1

在 Access 2003 Pro(内部版本 11.8321.8324)SP3 上测试。

重现步骤:

  • 创建一个新的数据库。
  • 创建一个新表格。
  • 在表格上放一个按钮。
  • 将以下代码粘贴到按钮的 Click 事件过程中:

Debug.Print Workspaces.Count
Debug.Print CurrentDb.Name

  • 关闭代码编辑器和表单,保存更改。
  • 不要跳过这一步:关闭访问。
  • 重新打开 Access 和您的数据库。
  • 打开表格
  • 点击按钮
  • 单击工具栏按钮将表单切换到设计模式。

您应该看到以下错误对话框:

您目前没有对数据库的独占访问权限。如果您继续进行更改,您以后可能无法保存它们。

访问错误对话框

有谁知道这里发生了什么?

4

1 回答 1

0

简单的解决方法是在第一次调用 Workspaces 之前调用 CurrentDb:

Debug.Print CurrentDb.Name
Debug.Print Workspaces.Count
Debug.Print CurrentDb.Name

我会尝试揭开正在发生的事情的神秘面纱,但这只是我的理论。

Access 帮助文件的相关位如下(针对 CurrentDb):

注意 在以前版本的 Microsoft Access 中,您可能使用语法 DBEngine.Workspaces(0).Databases(0) 或 DBEngine(0)(0) 来返回指向当前数据库的指针。在 Microsoft Access 2000 中,您应该改用 CurrentDb 方法。CurrentDb 方法创建当前数据库的另一个实例,而 DBEngine(0)(0) 语法引用当前数据库的打开副本。CurrentDb 方法使您能够创建多个引用当前数据库的数据库类型变量。Microsoft Access 仍支持 DBEngine(0)(0) 语法,但您应该考虑对您的代码进行此修改,以避免在多用户数据库中可能发生冲突。

对于 Workspaces 集合:

当您第一次引用或使用 Workspace 对象时,您会自动创建默认工作区DBEngine.Workspaces(0)。

似乎通过在第一次调用 CurrentDb 之前创建默认工作区,您会以某种方式导致 CurrentDb 忘记它应该如何工作。似乎不是创建当前数据库的新实例,而是使用默认工作区中已经存在的实例。

当然,这都是猜测,我和你一样好奇,想知道“真正的答案”。

于 2010-10-21T16:24:44.347 回答