Excel ADO“由于您和另一个用户试图同时更改相同的数据,所以访问数据库引擎停止了该过程”

时间:2019-02-05 10:28:01

标签: excel vba ado

我从SQL Server检索数据并将其存储在Excel中的工作表上,然后在Excel中运行ADO UPDATE查询以更新其他工作表上的数据。

在开发过程中我没有遇到此错误,但是用户报告他们经常看到此错误:

请注意,该文件位于网络驱动器上,但是即使将文件复制到其他位置,它仍然会产生上述错误。

代码:

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

Application.ScreenUpdating = False
Application.EnableEvents = False

cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & ThisWorkbook.FullName & "';" & _
         "Extended Properties=""Excel 12.0;HDR=YES;"";"

Set rs = GetOverview
shUpdateSLSheet.UsedRange.clear
WriteHeadersToSheet rs, shUpdateSLSheet.Name, 1
shUpdateSLSheet.Range("A2").CopyFromRecordset rs

If (rs.EOF And rs.BOF) Then GoTo NoData

cmd.ActiveConnection = cnn
cmd.CommandType = adCmdText

cmd.CommandText = "UPDATE [SL$] INNER JOIN [UpdateSLSheet$] " & _
                    "ON ([SL$].ID = [UpdateSLSheet$].ID) " & _
                        "SET [SL$].[CS_A] = [UpdateSLSheet$].[CS_A]" & _
                        ", [SL$].[CS_B] = [UpdateSLSheet$].[CS_B]" & _
                        ", [SL$].[CS_C] = [UpdateSLSheet$].[CS_C]" & _
                        ", [SL$].[CS_D] = [UpdateSLSheet$].[CS_D]" & _
                        ", [SL$].[CS_E] = [UpdateSLSheet$].[CS_E]" & _
                        ", [SL$].[CS_F] = [UpdateSLSheet$].[CS_F]" & _
                        ", [SL$].[Solved By SR] = [UpdateSLSheet$].[SolvedBySR]" & _
                        ", [SL$].[Comments] = [UpdateSLSheet$].[Comments]"

cmd.Execute

Application.EnableEvents = True
Application.ScreenUpdating = True

Set cmd = Nothing
Set rs = Nothing
Set cnn = Nothing

cmd.Execute一经执行就会出现错误。

编辑:我不知道为什么会这样。在这种情况下,我将使用一种迭代方法,而不是使用ADO。

2 个答案:

答案 0 :(得分:0)

您必须对记录集使用open方法并使用锁类型 因此,当某人添加数据库时,该数据库实际上已锁定,而此人添加完数据库后,该数据库将保存更改,然后另一个人可以开始添加

答案 1 :(得分:0)

有点晚了,但是我遇到了同样的问题,并找到了解决方案:我尝试在连接字符串中使用 OLD 驱动程序,即使工作簿是XLSM,它也像一个魅力一样起作用!
希望对别人有帮助。

sConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & wbName
sConn2 = ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
On Error GoTo hell
Set con = New ADODB.Connection
'con.Open sConn & sConn2
con.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
       "DriverId=790;" & _
       "Dbq=" & wbName & ";" & _
       "DefaultDir=" & wbname & ";ReadOnly=False;"