从excel vba到Access DB的多个同时连接
我正在为一家使用Access数据库的银行构建一个有点复杂的Excel表格 此工作表将大量数据加载到预构建的工作表中。 之后,他们可以运行几个宏并添加一些输入 最后,我打开了一个新的连接,将这些输入插入到不同的表中,这些表与最初查询的表不同 我的问题是,将信息加载到工作簿时,此操作一次只能由一个用户执行 当此进程在一台用户计算机上运行时,其他用户会收到错误 Microsoft Office Access数据库引擎无法打开或写入 文件“”无效。它已被其他用户或您以独占方式打开 需要查看和写入其数据的权限 我知道用户有权限,因为一旦在用户1上完成该过程,用户2就没有问题了 我正在使用ADODB(连接、记录集和命令),这是我在access中四个不同的存储查询中使用的大约四次代码:从excel vba到Access DB的多个同时连接,vba,excel,ms-access,adodb,Vba,Excel,Ms Access,Adodb,我正在为一家使用Access数据库的银行构建一个有点复杂的Excel表格 此工作表将大量数据加载到预构建的工作表中。 之后,他们可以运行几个宏并添加一些输入 最后,我打开了一个新的连接,将这些输入插入到不同的表中,这些表与最初查询的表不同 我的问题是,将信息加载到工作簿时,此操作一次只能由一个用户执行 当此进程在一台用户计算机上运行时,其他用户会收到错误 Microsoft Office 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。因此,在拆分多用户访问安装中,我们可以将多个前端文件连接到同一个后端文件,该文件只保存表。我唯一的猜测是后端认为所有连接都来自同一前端。我没有经验说你的连接字符串是否可以用不同的方式构建。