我正在为使用Access数据库的银行构建一个有点复杂的Excel工作表。
此工作表将大量数据加载到预建工作表。 之后,他们可以运行一些宏并添加一些输入 最后,我打开一个新连接,将这些输入插入到与开始查询的表中不同的表中
我的问题是,在将信息加载到工作簿时,此操作一次只能由一个用户执行。
当此进程在一台用户计算机上运行时,其他用户会收到错误
Microsoft Office Access数据库引擎无法打开或写入 文件 ''。它已经由其他用户或您独家打开 需要获得查看和写入数据的权限。
我知道用户有权限,因为一旦在用户1上完成了该过程,用户2就没有问题。
我正在使用ADODB(连接,记录集和命令),这是我在访问中使用的四个不同存储查询的四个不同时间的代码:
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文件的表格(我认为这可能很重要)
答案 0 :(得分:1)
尝试使用rs.Open
代替cmd.Execute
,并指定锁定类型:
在End With
:
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open cmd_apoio, cnn, adOpenStatic, adLockOptimistic
答案 1 :(得分:1)
您需要明确设置连接模式:
Set cnn = New ADODB.Connection
cnn.Mode = 16 + 3 'adModeShareDenyNone + adModeShareReadWrite '
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " & PV.dbpath
见这里:https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/connectmodeenum
答案 2 :(得分:1)
我只能提供我一直认为不会成为多用户的评论。
在将Excel连接到Access时 - 我已经做了很多 - 在从Access端工作时,必须始终关闭excel。 Excel中不能直接存在用户 - 它对Access的作用就像表格一样。
你在使用Excel作为前端与Access表链接的另一个方向 - 但就多用户而言,我想知道情况是否相同。
答案 3 :(得分:0)
我和你的情况一样,使用 excel 作为前端连接到存储在 Access 中的数据。 我通过在用户采取的每一个操作上建立和关闭连接来解决这个多用户问题。 它大大降低了性能,但我想它可以实现并发使用。
cnn.Close
Set cnn = Nothing