Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 如何通过ADO打开Access DB,以便我可以写入,而其他人只能读取?_Ms Access_Ado - Fatal编程技术网

Ms access 如何通过ADO打开Access DB,以便我可以写入,而其他人只能读取?

Ms access 如何通过ADO打开Access DB,以便我可以写入,而其他人只能读取?,ms-access,ado,Ms Access,Ado,从文档中,我希望AdModeSharedyWrite是一种方式,但它不能正常工作 我通过ADO使用Access数据库。我的连接字符串表示Mode=8,这是adModeShareDenyWrite。但当我尝试从表中删除一行时,我得到: 未指定的错误,说明:无法从指定的表中删除。来源:Microsoft JET数据库引擎 换句话说,该设置阻止我使用自己的连接更新数据库 我在网上发现了另外两篇报道同样情况的帖子,与Access一起使用的AdModeSharedyWrite设置未按文档所述工作 我正在寻

从文档中,我希望AdModeSharedyWrite是一种方式,但它不能正常工作

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

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

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

我在网上发现了另外两篇报道同样情况的帖子,与Access一起使用的AdModeSharedyWrite设置未按文档所述工作

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


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

一个解决方案是让他们访问数据库的副本。他们可以更改任何他们想要的内容,但这不会阻止您将其复制到主机上。

我想您可以从客户端接口访问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连接。管理员将有权插入/更新/删除,而其他用户将无法查看数据。这意味着您在程序中的某个地方,或者理想情况下在一个表中,有一些数据表明在您的应用程序中谁是什么

编辑:以下是Corey的多个注释:

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

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

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

Corey Trager写道:

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

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

也就是说,我并不是说这是你问题的根源(我真的不能说是这样或那样),只是指出,如果这是原因,那么你就没有什么该死的事情可以通过编程来解决它。

Cory Trager写道:

我在这里的动机是尽量减少 数据库损坏的可能性。什么之中的一个 mdb文件损坏的原因 微软提供了两个应用程序 写入同一数据库。所以,我想 确保只有一个应用程序可以具有 将连接写入数据库。其他人可以 阅读,但当他们尝试阅读时应该失败 写不管是谁联系的 先赢

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

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

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


另一方面,您应该仍然能够使用专用锁打开,我不知道为什么它不起作用。您是否考虑过使用DAO而不是ADO来操作Jet数据?假设它是本机数据接口(而不是通用接口层),如果你有多个用户通过网络连接到Access数据库,你可能想考虑升级到SQLServer而不是使用Access。

我不太熟悉Access DB或ADO,但它不是仅仅是一个单独的用户文件/程序吗?“其他人”从哪里来?如何确定“你”是谁?你可以有多个用户,并且他们有一个安全系统(但我不知道问题的答案)。我希望得到一个坚持我的ADO连接字符串的答案,特别是模式。你如何连接到Access文件?你的客户端界面是由什么组成的?您的计算机是工作组的一部分吗?域?ADO,无网络问题。mdb文件与通过ADO连接的应用程序位于同一个框中。抱歉,这不是我想要的。我在问题中添加了更多内容,以澄清我希望执行的操作。AdModeSharedyWrite不适用于我。它剥夺了我写自己的连接的能力