Excel ADO «Механизм доступа к базе данных остановил процесс, поскольку вы и другой пользователь пытаетесь изменить одни и те же данные одновременно» - PullRequest
0 голосов
/ 05 февраля 2019

Я извлекаю данные из SQL Server и сохраняю их на листе в Excel, а затем запускаю запрос ADO UPDATE в Excel, чтобы обновить данные на другом листе.

Я не сталкивался с этой ошибкой при разработкеоднако пользователи сообщают, что часто видят эту ошибку:

Обратите внимание, что файл находится на сетевом диске, но даже после копирования файла вв другом месте, он по-прежнему выдает указанную ошибку.

Код:

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 голосов
/ 26 июня 2019

Немного поздно, но у меня возникла та же проблема, и я нашел решение: я попытался использовать драйвер 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;"
0 голосов
/ 05 февраля 2019

Вы должны использовать метод open для набора записей и использовать тип блокировки, чтобы база данных фактически блокировалась, когда кто-то добавляет, и когда этот человек закончит добавление, база данных сохранит изменения, и тогда другой человек может начать добавлять

...