2010-07-29 63 views
0

我有一个用户给我发送了一封错误消息,当他试图将记录保存到Access 2003数据库时发生了错误消息。除了无法保存数据库设计更改的错误消息外,没有其他任何异常,她只是试图保存记录。访问 - 设计更改错误消息,而不尝试进行更改

以下是完整的错误信息......

“的Microsoft Office Access不能保存 设计更改或保存到一个新的 数据库对象,因为其他用户 打开了该文件。要保存设计 更改或保存到新对象, 您必须拥有对 文件的独占访问权。“

在用户系统中,Access 2003用作所有数据存储在SQL Server 2008中的字体结尾。系统中有几个用户,因此两个用户完全有可能访问同一记录。事实上,错误消息似乎表明设计更改是当所有用户试图执行的操作都是保存记录数据。

有什么想法?

+0

它们使用存储在中央网络共享MDB文件的共享副本。 – webworm 2010-07-29 17:29:15

+1

这是一个严格的禁忌。每个用户都必须拥有自己的前端副本,但是,您仍然不应该收到设计更改错误。 – Fionnuala 2010-07-29 19:12:53

+2

用户在尝试保存记录时尝试使用什么方法?如果2个用户具有相同的FE打开,并且一个使用Ctrl + s,则Access将尝试保存表单本身......这需要独占访问数据库。 – HansUp 2010-07-29 19:33:01

回答

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版本中共享前端)。

随着A2000,每一个变化到在前端的每个用户接口对象是一个改变为存储在单个单片BLOB字段在一个单一的记录中的数据。这意味着有多个用户尝试更新单个记录中的相同字段可以保证并发性问题。

其次,它是一个巨大的BLOB字段,它的内部结构是相当复杂的,但完全陌生到Jet/ACE(这实际上是处理该字段中的数据的读取和保存)。

为了把这个在常规数据库应用方面,共享前端就像有一个备注字段,所有的用户都试图在一个记录同时输入到相同的备注字段一个数据库应用程序。这会导致可怕的并发问题,并可能很快破坏备忘指针。

当您共享一个接入前端,你正在做同样的事情 - 让所有的用户在一个单一的记录同时编辑一个字段。

一旦你理解了这一点,应该是不言而喻的,你不应该这样做。

+0

真棒解释大卫!非常感谢你。 – webworm 2010-08-03 16:57:47