我有一位用户通过电子邮件向我发送了一条错误消息,当时他试图将记录保存到Access 2003数据库时发生了错误消息。除了错误消息之外,没有什么不寻常的,她无法保存数据库设计更改,而她只是试图保存记录。
以下是完整的错误消息...
“Microsoft Office Access无法保存 设计更改或保存到新的 数据库对象因为另一个用户 打开文件。保存您的设计 更改或保存到新对象, 你必须拥有独家访问权限 文件“。
在用户系统中,Access 2003用作字体结尾,其中所有数据都存储在SQL Server 2008中。系统中有一些用户,因此完全有可能两个用户访问同一记录。事实上,错误消息似乎表明设计更改是在所有用户尝试执行操作时尝试保存记录数据。
有什么想法吗?
答案 0 :(得分:3)
这不是你问题的答案(我认为HansUp提供了最合理的问题解释),但解释了为什么你永远不应该分享前端。
在Access 2000之前,前端的用户界面对象(表单,报表,模块等)的定义存储在系统表中,每个对象有一个记录。当引入A2000时,MS对此进行了更改,以便将VBE合并到Access中(以便与托管VBA的其他Office应用程序保持一致)。这需要改变存储代码承载对象(或潜在的代码承载)的方式。 VBA项目中的所有Access对象都存储在系统表中单个记录的单个BLOB字段中,而不是系统表中每个对象一个记录。
现在,备份一分钟,并考虑旧版本的工作原理。
当用户编辑表单并保存编辑时,只会更改系统表中代表该表单的记录。如果多个用户使用该前端,可能会出现并发问题,因为他们不会加载相同的系统表记录,也不会同时更新它们。
你可能会说“但我的前端并没有改变设计!”
但你错了。访问透明地保存表单的某些用户更改的属性,特别是过滤器和排序。除非您使用DoCmd.Close acForm,Me.Name,acSaveNo关闭表单,否则用户对过滤器和排序的更改将保存到幕后窗体的定义中。当用户按下Ctrl-S键命令(例如表单大小和位置)时,可能会显式保存其他可能的属性。其他更改可能会导致提示,例如,如果用户隐藏/调整数据表格中的列(不知道那里发生了什么 - 可能需要Ctrl-S)。
现在,考虑A97及之前发生的事情 - 每次用户关闭时系统表中记录所代表的每个表单都会更新,但碰撞方式并不多,没有一个用户在设计模式下打开表单,因此每个人都使用乐观锁定,因此当他们关闭表单时,他们的更改会被保存。现在,如果另一个用户关闭了表单,可能是他们得到另一个用户更改了表单的提示,但可能没有(我不知道,因为我从未在任何版本的Access中共享过前端)。 / p>
对于A2000,前端中每个用户界面对象的每次更改都是对单个记录中单个单片BLOB字段中存储的数据的更改。这意味着多个用户尝试更新单个记录中的相同字段时会出现并发问题。
其次,它是一个巨大的BLOB字段,其内部结构相当复杂,但Jet / ACE完全不知道(实际上处理读取和保存该字段中的数据)。
要将其置于常规数据库应用程序术语中,共享前端就像拥有一个带有备注字段的数据库应用程序,其中所有用户都试图同时在单个记录中键入同一备忘录字段。这会导致可怕的并发问题,并可能很快破坏备忘录指针。
当您共享Access前端时,您正在做同样的事情 - 让所有用户同时编辑单个记录中的单个字段。
一旦你理解了这一点,你应该永远不要这样做。