从文档中,我希望adModeShareDenyWrite成为一种方式,但它无法正常工作。
我正在通过ADO使用Access数据库。我的连接字符串表示Mode = 8,即adModeShareDenyWrite。但是当我尝试从表中删除一行时,我得到:
未指定错误,描述:无法从指定表中删除。,来源:Microsoft JET数据库引擎
换句话说,该设置阻止ME使用我的OWN连接更新数据库。
我在网上发现了其他一些报告相同内容的帖子,与Access一起使用的adModeShareDenyWrite设置无法按照文档记录。
我正在寻找一种不涉及管理员更改权限的解决方案。它需要是我的程序可以控制的东西。
我的动机是尽量减少数据库损坏的可能性。 Microsoft记录的mdb文件损坏的原因之一是两个应用程序写入同一个数据库。所以,我想确保只有一个应用程序可以与db建立连接。其他人可以阅读,但在尝试写作时应该失败。谁先建立联系就赢了。
答案 0 :(得分:2)
Cory Trager写道:
我的动机是尽量减少 数据库损坏的可能性。之一 mdb文件损坏的原因 Microsoft记录的是两个应用程序 写入同一个数据库。所以,我想 确保只有一个应用程序可以拥有 写入与db的连接。其他人可以 阅读,但尝试时应该失败 写。谁建立联系 第一次胜利。
你为什么担心呢?默认情况下,Jet是一个多用户数据库引擎。如果其他人正在更新表,则所涉及的数据页将被锁定为只读(在写入开始之前的状态)。
没有现实的理由担心单用户互动会导致腐败。 Jet数据库的损坏通常是由于连接中断或写入期间连接中断(例如强制退出没有响应的应用程序的用户)。
我认为你对腐败的恐惧是错误的。
另一方面,您仍然可以使用独占锁打开,我不知道为什么它不起作用。您是否考虑过使用DAO而不是ADO来操作Jet数据?鉴于它是原生数据接口(而不是通用接口层),它应该更容易。
答案 1 :(得分:0)
一种解决方案是让他们访问数据库的副本。他们可以改变他们想要的任何东西,但它不会超过你与主人一起复制它。
答案 2 :(得分: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连接。管理员将有权插入/更新/删除,而其他用户将无法查看数据。这意味着您在程序中的某个位置,或理想情况下在表格中,某些数据表明您的应用程序中的内容。
编辑:跟随Corey的多次评论:
你将无法直接做你想做的事。我的建议:当应用程序访问数据库时,它会检查.mdb文件夹中的特殊文件(无论文件是什么)。
如果此文件存在,应用程序将打开“只读”连接。
如果此文件不存在,应用程序将创建该文件(您可以使用“transferDatabase”创建一个文件)并打开读写连接。退出应用程序后,销毁该文件。
答案 3 :(得分:0)
Corey Trager写道:
我正在寻找解决方案 不涉及管理员 更改权限。它需要 我的程序可以控制的东西。
好吧,如果问题是由于NTFS权限对用户来说是只读的,那么就没有办法让MDB可写。您没有在服务器或本地硬盘驱动器上指定MDB的存储位置,但在任何一种情况下,如果用户对MDB具有WRITE权限,则必须将NTFS权限设置为允许它(对于共享)在服务器上,必须在SHARE和底层文件上允许它。如果它是本地文件,最好的解决方案是确保将文件存储在用户级别登录具有完全WRITE权限的位置。这可以是用户个人资料中的任何地方,而且几乎没有其他任何地方。
那就是说,我并不是真的在暗示这是你的问题的根源(我真的不能说这种或那种方式),只是指出如果它是的原因那么你可以通过编程方式解决这个问题。
答案 4 :(得分:0)
如果您有多个用户通过网络连接到访问数据库,您可能需要考虑升级到SqlServer而不是使用Access。