【问题标题】:Can MS Access 2007 support multiuser environment?MS Access 2007 可以支持多用户环境吗?
【发布时间】:2011-02-15 09:11:47
【问题描述】:

有一个应用程序在多台机器上运行(大约在 2 台机器上)。此应用程序更新放置在网络上的共享 mdb。两个用户都试图一次更新共享 mdb,但问题是只有一个用户是能够一次更新mdb。另一个用户无法打开它。谁能建议访问支持多用户环境?

编辑:
有一种形式的 TFormRoadAttrib。当它激活时调用以下函数

procedure TFrmRoadAttrib.FormActivate(Sender: TObject);
if dmTimeDomain <> nil then
   begin
     if not (dmTimeDomain.dbTimeDomain.InTransaction) then
     begin
       dmTimeDomain.dbTimeDomain.BeginTrans;
     end;
   end;

其中dbTimeDomain=TADOConnection,其值为

'Provider=Microsoft.ACE.OLEDB.12.0;
模式=共享拒绝无;
扩展属性="";
区域标识符=1033;
Jet OLEDB:注册表路径="";
Jet OLEDB:数据库密码="";
Jet OLEDB:引擎类型=4;
Jet OLEDB:数据库锁定模式=0;
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:新数据库密码="";
Jet OLEDB:创建系统数据库=False;
Jet OLEDB:加密数据库=假;
Jet OLEDB:不要在 Compact=False 上复制区域设置;
Jet OLEDB:Compact without Replica Repair=False;
Jet OLEDB:SFP=假;
数据源=Q:\BEL_01\BEL_GADM\ACCESS\Restrictions.mdb;
Jet OLEDB:系统数据库=C:\Program Files\Tele Atlas\Common Files\DPT.MDW;
用户 ID=dbadpt;
密码=dbadpt;

当我们点击 Ok 按钮时,下面的代码就会执行

if dmTimeDomain <> nil then
 begin
      if (dmTimeDomain.dbTimeDomain.InTransaction) then
            dmTimeDomain.dbTimeDomain.CommitTrans;
     end;
end;                                                                

请推荐。

【问题讨论】:

  • 去掉delphi标签。它不适用于您的问题或对您的问题没有帮助。
  • 如果其中一位用户正在使用 Delphi 应用程序怎么办?没有提供足够的信息来了解,但 Delphi 数据访问层中的某些东西可能会导致问题。实际上,现在我已经阅读了下面的 cmets,正是这种情况。 Delphi 标记绝对属于,但我们还需要 Delphi 代码,以便 Delphi 人员可以弄清楚选项是什么。
  • 请贴出控制交易的Delphi代码。这可能是问题的根源。
  • 我已经更新了我的问题的描述字段请查看它以获取更多信息。
  • 连接字符串中定义的连接模式是“Share Deny None”,而在共享 mdb 中它设置为“share”。如果我将连接字符串中的模式更改为“ReadWrite”,则错误即将到来.

标签: delphi ms-access


【解决方案1】:

Access 绝对支持多用户环境,但您的权限必须设置正确。所有用户都必须能够在数据库所在目录中创建文件,并且所有用户都必须有权修改其他用户在该目录中创建的文件。有很多方法可以把它搞砸。这是因为 Access 使用单独的 .ldb 文件作为其管理并发、多用户访问机制的一部分。

一个好的测试是让一个用户在共享目录中创建一个文本文件,然后确保其他用户可以打开该文件,然后保存对它的更改。

【讨论】:

  • 谢谢史蒂夫。但这不是问题。每个用户都拥有网络驱动器的完全访问权限。如果一个用户关闭 mdb,那么另一个用户可以打开并更新它。
  • 两个用户是直接打开数据库,还是通过链接表打开?如果直接,请确保没有用户尝试打开数据库以进行“独占访问”。此外,权限设置可能很复杂,所以我建议进行我建议的测试。用户可以完全访问目录,但是对于由一个用户在目录中创建的新文件,其他用户无法修改。
  • 这可能很有趣:office.microsoft.com/en-us/access-help/…。应用程序是否可能允许修改后端数据库中的对象?
  • 使用“干净”的前端可能值得测试,即具有简单表单和一两个链接表的 Access 前端。让每个用户都有一份,看看问题是否还存在。
  • 我想我在这方面找到了一些东西。每当用户访问共享 mdb 时,事务就会开始,直到该事务提交之前,其他用户都不能更新共享 mdb,因为它在这段时间内被锁定。应用程序是在使用 inittrans、committrans 等的 Delphi 中。我认为问题出在此处。有没有办法知道此事务何时完成或 mdb 何时解锁。注意:所有用户都在使用单个应用程序运行唯一常见的东西它们只是共享 mdb。
【解决方案2】:

两者都应该能够使用该应用程序。如果一个用户正在编辑表单或表格,其他用户将无法编辑这些相同的对象。但是一旦它处于“生产”状态,这应该与应用程序无关。几年前,我帮助将一个大型应用程序转换为 MS SQL Server 后端(仍然是 MS Access 前端),直到那时,他们已经成功地同时与 15 个用户一起使用该应用程序。该应用程序变得太大(100 个表单、100 个表,有些有 100 万行),因此出于性能原因他们移动了。否则他们仍然会完全使用 Access。

【讨论】:

    【解决方案3】:

    考虑使用 Access 项目(adp 扩展名)而不是普通的 access mdb 文件。访问项目与 SQL Server 桌面引擎一起工作,您可以在 Office CD 上找到它作为单独的安装文件。这实质上意味着您正在运行的 SQL Server 版本略有降低,该服务器将为您处理所有并发问题。此外,如果您的数据库对于 Access 项目来说太大了,您可以轻松地将您的数据库移植到成熟的 SQL Server 机器上。您可以在 Access 项目中完成大多数可以使用 SQL Server 完成的事情,包括存储过程等,而且设置和连接起来非常容易。

    【讨论】:

    • Steve Jorgensen的回答评论显示前端不是Access,而是Delphi应用,所以这是一个不适用的建议。
    • 另外,我已经编写了 2 个应用程序作为 ADP,我不推荐它。 ADP 带来的问题比他们解决的问题多得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多