从excel vba到Access DB的多个同时连接

从excel vba到Access DB的多个同时连接,vba,excel,ms-access,adodb,Vba,Excel,Ms Access,Adodb,我正在为一家使用Access数据库的银行构建一个有点复杂的Excel表格 此工作表将大量数据加载到预构建的工作表中。 之后,他们可以运行几个宏并添加一些输入 最后,我打开了一个新的连接,将这些输入插入到不同的表中,这些表与最初查询的表不同 我的问题是,将信息加载到工作簿时,此操作一次只能由一个用户执行 当此进程在一台用户计算机上运行时,其他用户会收到错误 Microsoft Office Access数据库引擎无法打开或写入 文件“”无效。它已被其他用户或您以独占方式打开 需要查看和写入其数据的

我正在为一家使用Access数据库的银行构建一个有点复杂的Excel表格

此工作表将大量数据加载到预构建的工作表中。 之后,他们可以运行几个宏并添加一些输入 最后,我打开了一个新的连接,将这些输入插入到不同的表中,这些表与最初查询的表不同

我的问题是,将信息加载到工作簿时,此操作一次只能由一个用户执行

当此进程在一台用户计算机上运行时,其他用户会收到错误

Microsoft Office Access数据库引擎无法打开或写入 文件“”无效。它已被其他用户或您以独占方式打开 需要查看和写入其数据的权限

我知道用户有权限,因为一旦在用户1上完成该过程,用户2就没有问题了

我正在使用ADODB(连接、记录集和命令),这是我在access中四个不同的存储查询中使用的大约四次代码:

Dim cnn As ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim cmd_apoio As New ADODB.Command

Set cnn = New ADODB.Connection
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " & PV.dbpath

With cmd_apoio
    .ActiveConnection = cnn
    .CommandType = adCmdStoredProc
    .CommandText = "tabela_apoio_entidades"
    .Parameters.Append .CreateParameter("nip", adNumeric, adParamInput, 20)
    .Parameters.Append .CreateParameter("anomes", adNumeric, adParamInput, 20)
    .Parameters(0) = PV.nip_grupo
    .Parameters(1) = PV.ano_mes
End With

Set rs = cmd_apoio.Execute()
(PV.变量是在另一个模块(PV)中声明的公共变量) 使用此方法是否有一种方法允许同时进行多个连接? 尤其是因为这只是为了检索信息(只读),而不是更新表中的任何记录

我使用的是Excel 2013和Access 2013,数据库是.accdb


编辑:表格是链接到txt文件的表格(我认为这可能很重要)

尝试使用
rs.Open
而不是
cmd.Execute
,并指定锁类型:

在您的
结束后:

Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open cmd_apoio, cnn, adOpenStatic, adLockOptimistic

您需要明确设置连接模式:

Set cnn = New ADODB.Connection
cnn.Mode = 16 + 3    'adModeShareDenyNone + adModeShareReadWrite   '
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " & PV.dbpath

请参见此处:

我只能提供我一直认为excel不是多用户的评论

在将Excel链接到Access(我做了很多)时,从Access端工作时,Excel必须始终关闭。Excel中不能直接有用户-它的角色是访问类似于表的行为


在使用Excel作为前端并链接Access表方面,您正朝着另一个方向前进——但就多用户而言,我想知道情况是否相同。

我的情况与您相同,将Excel作为前端连接到Access中存储的数据。 我通过建立和关闭用户执行的每个操作的连接,解决了这个多用户问题。 它大大降低了性能,但我想它支持并发使用

cnn.Close
Set cnn = Nothing

我这样做了,删除了Set rs=cmd_apoio.Execute()我得到了一个错误:运行时错误“3707”无法更改记录集对象的ActiveConnection属性,该记录集对象的sourceRemove
。ActiveConnection=cnn
,然后再次尝试,结果显示同样的错误,我从open语句中删除了cnn,如
rs.open cmd\u apoio、adOpenStatic、adLockOptimistic
,并保留了
.ActiveConnection=cnn
。这是可行的,就像它运行时一样,但不能解决多用户问题。你会得到同样的错误吗?如果是这样,那么它意味着其他人/事物(或同一应用程序中的其他代码)以独占方式打开了它。我仍然得到相同的错误,唯一可以创建此错误的对象是adodb。连接,对吗?我在不同的宏上使用了其中的四个宏,我总是关闭它们,并且所有这些宏都实现了这段代码。@Joelalmeda然后其他一些宏必须以独占方式打开该文件。您是否在Access IDE中打开了它?否,测试此项时数据库文件已关闭。该文件在(银行的)专用网络上共享,PV.path是访问数据库的网络文件夹/文件的路径。网络方面是否存在任何限制/安全防范措施来防止这种情况?我使用的唯一连接设置为
cnn.Mode=16+3
制作只有您拥有/可以访问的Access MDB的本地副本,然后将您的程序改为访问该副本,然后查看它是否工作。这将告诉您问题是在代码中还是在网络/安全方面。(注意:在用你的程序测试之前,不要用任何东西打开这个副本。如果你打开了,那么在测试之前重新启动你的盒子,以确保盒子的背景中没有任何东西锁定它)我想我完全理解你的评论。虽然我使用excel作为前端来访问它主要是只读信息,但由于用户从不更新查询表中的数据,他们只输入一些存储在不同表中的新值。我展示的数据只是决策过程的一个附件。我唯一需要它成为多用户的时候是,当它为表插入加载信息(建立连接以在Excel中显示数据)时,我可以简单地检查连接是否清晰,然后等待,因为此操作发生的频率较低。因此,我可能已过时。我不认为一个人可以让多个人同时在同一个excel工作簿/文件中工作。特别是在输入/编辑数据方面。就是这样,它不是同一个文件,它是本地存储在每台计算机上的同一个文件的副本,不同的工作簿连接到同一个DBA ok。因此,在拆分多用户访问安装中,我们可以将多个前端文件连接到同一个后端文件,该文件只保存表。我唯一的猜测是后端认为所有连接都来自同一前端。我没有经验说你的连接字符串是否可以用不同的方式构建。