Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Access/Excel集成:如何避免同时使用的用户之间的冲突?_Sql_Excel_Database_Vba_Ms Access - Fatal编程技术网

Sql Access/Excel集成:如何避免同时使用的用户之间的冲突?

Sql Access/Excel集成:如何避免同时使用的用户之间的冲突?,sql,excel,database,vba,ms-access,Sql,Excel,Database,Vba,Ms Access,我正在开发一个excel工具,它通过VBA连接到Access数据库,并根据用户请求在excel和数据库之间传输数据。每个用户都有自己版本的excel工作簿,该工作簿连接到中央数据库。在大多数情况下,这很好,但我发现当两个用户同时尝试连接时会发生一些冲突,导致其中一个用户excel/VBA崩溃,而没有任何VBA错误代码 我怀疑这是由于数据库连接被第二个用户以某种方式中断造成的 所以我的问题是: 是否有一种方法可以在第一个用户连接后“锁定”连接,然后在第二个用户尝试连接时知道数据库正在使用,这样他的

我正在开发一个excel工具,它通过VBA连接到Access数据库,并根据用户请求在excel和数据库之间传输数据。每个用户都有自己版本的excel工作簿,该工作簿连接到中央数据库。在大多数情况下,这很好,但我发现当两个用户同时尝试连接时会发生一些冲突,导致其中一个用户excel/VBA崩溃,而没有任何VBA错误代码

我怀疑这是由于数据库连接被第二个用户以某种方式中断造成的

所以我的问题是: 是否有一种方法可以在第一个用户连接后“锁定”连接,然后在第二个用户尝试连接时知道数据库正在使用,这样他的请求就可以中止/延迟,而不会导致excel崩溃

我已经包含了其中一个事务的代码,它将数据从excel移动到数据库

公共子导出访问()
“建立与数据库的连接”
Set cn=New ADODB.Connection
cn.ConnectionString=“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=“&dbPath&”Persist Security Info=False;”
中国公开赛
Set rstDbTable=New ADODB.Recordset
带rstDbTable
.打开“AllCapacity”,cn,adOpenKeyset,AdLock悲观,adCmdTable
以
“移动数据”
“一次一个区域
对于面积=0到UBound(cap_面积)
toDbArray=sh_capacity.Range(cap_area(area))'将有问题的范围保存到db阵列中。从1点开始
'MsgBox(Todbaray(1,1))
对于所有行,i=1到UBound(Todbaray,1)'
rstDbTable.Filter=“CapArea=”&名称区域(area)&“_
&“和周=”&周&“_
&“和AreaWeekID=”&i&“
如果为rstDbTable.EOF,则“检查其是否为空,然后创建新记录”
MsgBox(“在数据库中找不到行。脚本正在结束。CapArea=“&NamesArea(area)&.AreaWeekId=“&i”)
停止调试器
转到内码
如果需要添加新行,请使用“rstDbTable.AddNew”
其他的
'rstDbTable(“AreaWeekID”)。值=Todbaray(i,27)
'rstDbTable(“周”)。值=今天(i,28)
'rstDbTable(“CapArea”)。值=toDbArray(i,29)
'启动=计时器
rstDbTable(“MO_DA”)。值=Todbaray(i,2)
'MsgBox(计时器-启动)
rstDbTable(“MO_EV”)。值=Todbaray(i,3)
rstDbTable(“MO_NI”)。值=Todbaray(i,4)
rstDbTable(“TU_DA”)。值=Todbaray(i,5)
rstDbTable(“TU_EV”)。值=Todbaray(i,6)
rstDbTable(“TU_NI”)。值=Todbaray(i,7)
rstDbTable(“WE_DA”)。值=Todbaray(i,8)
rstDbTable(“WE_EV”)。值=Todbaray(i,9)
rstDbTable(“WE_NI”)。值=Todbaray(i,10)
rstDbTable(“TH_DA”)。值=toDbArray(i,11)
rstDbTable(“TH_EV”)。值=Todbaray(i,12)
rstDbTable(“TH_NI”)。值=Todbaray(i,13)
rstDbTable(“FR_DA”)。值=toDbArray(i,14)
rstDbTable(“FR_EV”)。值=toDbArray(i,15)
rstDbTable(“FR_NI”)。值=Todbaray(i,16)
rstDbTable(“SA_DA”)。值=Todbaray(i,17)
rstDbTable(“SA_EV”)。值=Todbaray(i,18)
rstDbTable(“SA_NI”)。值=Todbaray(i,19)
rstDbTable(“SU_DA”)。值=Todbaray(i,20)
rstDbTable(“SU_EV”)。值=Todbaray(i,21)
rstDbTable(“SU_NI”)。值=Todbaray(i,22)
如果结束
rstDbTable.Update
接下来我
下一个领域
EndOfCode:
rstDbTable,关闭

您是否尝试使用了
adlock
锁定类型?我会选择
adOpenDynamic
记录集类型抱歉我反应太晚了。我尝试了你的两个建议,但问题仍然存在。你是否尝试使用
adLockOptimistic
锁定类型?我会选择
adOpenDynamic
记录集类型抱歉我反应太晚了。你的两个建议我都试过了,但问题仍然存在。