2

从文档中,我希望 adModeShareDenyWrite 成为方式,但它不能正常工作。

我正在通过 ADO 使用 Access 数据库。我的连接字符串显示 Mode=8,即 adModeShareDenyWrite。但是当我尝试从表中删除一行时,我得到:

未指定的错误,描述:无法从指定的表中删除。,来源:Microsoft JET 数据库引擎

换句话说,该设置阻止我使用我的 OWN 连接更新数据库。

我在网上发现了一些其他帖子报告了同样的事情,与 Access 一起使用的 adModeShareDenyWrite 设置没有按文档说明工作。

我正在寻找不涉及管理员更改权限的解决方案。它必须是我的程序可以控制的东西。

我的动机是尽量减少数据库损坏的机会。Microsoft 记录的 mdb 文件损坏的原因之一是两个应用程序写入同一个数据库。所以,我想确保只有一个应用程序可以与数据库建立写连接。其他人可以阅读,但在尝试写入时应该会失败。谁先建立联系,谁就赢了。

4

5 回答 5

2

科里·特拉格写道:

我的动机是尽量减少数据库损坏的机会。Microsoft 记录的 mdb 文件损坏的原因之一是两个应用程序写入同一个数据库。所以,我想确保只有一个应用程序可以与数据库建立写连接。其他人可以阅读,但在尝试写入时应该会失败。谁先建立联系,谁就赢了。

你为什么担心它?Jet 默认是一个多用户数据库引擎。如果其他人正在更新表,则所涉及的数据页将被锁定为只读(处于写入开始之前的状态)。

没有现实的理由担心仅仅是多用户交互造成的腐败。Jet 数据库的损坏通常是由于连接断开或写入期间连接中断(例如用户强制退出响应速度不快的应用程序)。

我认为你对腐败的恐惧是错误的。

另一方面,您应该仍然可以使用独占锁打开,我不确定为什么它不起作用。您是否考虑过使用 DAO 而不是 ADO 来操作 Jet 数据?鉴于它是本机数据接口(而不是通用接口层),它应该更容易。

于 2008-10-04T21:08:36.427 回答
0

如果您有多个用户通过网络连接到 access 数据库,您可能需要考虑升级到 SqlServer 而不是使用 Access。

于 2008-10-14T20:19:48.487 回答
0

科里·特拉格写道:

我正在寻找不涉及管理员更改权限的解决方案。它必须是我的程序可以控制的东西。

好吧,如果问题是由于 NTFS 权限对用户是只读的,那么您无法做任何事情来使 MDB 可写。您没有指定 MDB 的存储位置,在服务器上还是在本地硬盘驱动器上,但在任何一种情况下,对于具有 MDB 上的 WRITE 权限的用户,都必须设置 NTFS 权限以允许它(对于共享在服务器上,必须在 SHARE 和基础文件上都允许它)。如果它是本地文件,最好的解决方案是确保将文件存储在用户级登录具有完全 WRITE 权限的位置。这将是用户配置文件中的任何地方,几乎没有其他地方。

也就是说,我并不是真的暗示这是你问题的根源(我真的不能说一种或另一种方式),只是指出如果它原因,那么你就没有什么可以做的以编程方式解决它。

于 2008-10-03T19:23:36.827 回答
0

一种解决方案是让他们访问数据库的副本。他们可以改变他们想要的任何东西,但它不会让你与主人一起复制它。

于 2008-10-02T22:06:52.860 回答
0

我想你在这里从客户端接口访问一个 MDB 文件,不管它是什么,其他人也可以同时连接到同一个文件。当您在连接模式下使用 adModeShareDenyWrite 时,这意味着您仍然可以与其他人共享数据(在 MDB 文件中的表或记录上没有任何类型的锁)但无法修改(这就是您收到错误消息的原因)。

一种解决方案是管理您的连接参数,如下所示:

(where you have a user object with a '.role' property, or anything equivalent ...)
if activeUser.role = "admin" then
    m_connectionMode = adModeWrite
else
    m_connectionMode = adModeShareDenyWrite
endif

然后您可以使用参数 m_connectionMode 打开您的 ADO 连接。管理员将有权插入/更新/删除,而其他用户只能查看数据。这意味着您在程序中的某个地方,或者理想情况下在一个表中,有一些数据说明了您的应用程序中谁是什么。

编辑:跟随科里的多次评论:

你将无法直接做你想做的事。我的建议:当应用程序访问数据库时,它会检查 .mdb 文件夹中的特殊文件(无论文件是什么)。

如果此文件存在,应用程序会打开一个“只读”连接。

如果此文件不存在,应用程序会创建该文件(您可以使用“transferDatabase”创建一个文件)并打开一个读写连接。退出应用程序后,销毁文件。

于 2008-10-02T22:27:55.837 回答