2017-10-11 156 views
1

我正在为使用Access数据库的银行构建一个稍微复杂的Excel工作表。从excel vba到Access DB的多个同时连接

此表将一吨数据加载到预先构建的工作表。 之后,他们可以运行一些宏,并添加一些输入 最后,我打开一个新的连接,从那些地方在开始查询插入不同的表这些投入

我的问题是,当装载将信息发送到工作簿,此操作一次只能由一个用户执行。

当这个过程是在一个用户计算机的其他用户运行出现错误

The Microsoft Office Access database engine cannot open or write to the file ''. It is already opened exclusively by another user, or you need permission to view and write its data.

我知道,因为一旦这个过程对用户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)中) 使用这种方法可以一次允许多个连接吗? 特别是因为这只是检索信息(只读)而不是更新表中的任何记录。

我用Excel 2013和Access 2013,数据库是.ACCDB

编辑:表是链接表,TXT文件(我认为这可能是重要的)

回答

1

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

后您的End With

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

我这样做,去掉'设置RS = cmd_apoio.Execute()' 我得到的错误: 运行时错误“3707” 无法更改Recordset对象至极的ActiveConnection属性有一个命令对象作为其源 –

+0

删除'。ActiveConnection = cnn'然后再试一次 –

+0

仍然得到了同样的错误,我从'rs.Open cmd_apoio,,adOpenStatic,adLockOptimistic'等开放语句中删除了cnn,并保留'.ActiveConnection = cnn'。 这可行,因为它在运行,但不能解决多用户问题 –

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

+0

这不适用于我: –

+0

你有同样的错误吗?如果是这样,那么它意味着某人/别的东西(或同一应用程序中的其他代码)将其专门打开。 – RBarryYoung

+0

我仍然得到相同的错误,唯一可以产生此错误的对象是adodb.Connection正确的?我在不同的宏中使用了其中的四个,我总是关闭它们,并且它们都实现了这个代码。 –

1

我只能贡献,我一直认为创先争优不为多用户的意见。

在将Excel链接到Access中 - 我已经做了很多工作 - 在Access端工作时,必须始终关闭excel。在Excel中不能有用户 - 它的作用就像表格一样。

你在使用Excel作为Access端的前端链接的另一个方向 - - 但在多用户方面我不知道情况是否相同。

+0

我想我完全理解你的评论。 尽管我使用excel作为前端来访问它,但主要是只读信息,因为用户从不更新查询表中的数据,所以他们只输入一些新值,这些值存储在不同的表中。我所展示的数据只是决策过程的附件。 我需要它是多用户的唯一时间是当它加载信息(建立连接以在Excel中显示数据) 对于表插入,我可以简单地检查连接是否清除,并等待它,因为这操作发生的频率较低。 –

+0

所以我可能会过时。我不认为可以同时有多个人在同一个Excel工作簿/文件中工作。特别是在输入/编辑数据方面。 –

+0

这就是它,它不是相同的文件,它是每个单独的计算机上本地存储的相同文件的副本,不同的工作簿连接到相同的分贝 –