Загрузка данных с использованием транзакции VBA ADO - PullRequest
0 голосов
/ 23 ноября 2018

У меня проблема при загрузке данных из файла Excel (VBA) в бэкэнд Access.Я пытаюсь загрузить 2 записи в одной транзакции.Это делается с помощью цикла.
Соответствующая часть кода.

cnn.BeginTrans        
'(some test data)
SomeNumber = 2
NewText = "new text"

For i = 0 To 1
    Set cmd = New ADODB.Command        
    '(increase [counter] field in database)
    With cmd
        .ActiveConnection = cnn
        .CommandType = adCmdText
        .CommandText = "UPDATE [tbltest] " & _
                        "SET [counter] = [counter] + 1 " & _
                        "WHERE [counter]  > ?"
        .Parameters.Append .CreateParameter(, adInteger, adParamInput, , SomeNumber)
        .Execute
    End With

    Set cmd = New ADODB.Command
    '(insert new row in gap)
    With cmd
        .ActiveConnection = cnn
        .CommandType = adCmdText
        .CommandText = "INSERT INTO [tbltest] ([counter], [txtfield]) " & _
                        "VALUES (?, ?)"
        .Parameters.Append .CreateParameter(, adInteger, adParamInput, , SomeNumber + 1)
        .Parameters.Append .CreateParameter(, adVarChar, adParamInput, 50, NewText & i)
        .Execute
    End With
Next i
cnn.CommitTrans

tblПроверка в начале

Counter,  txtfield
1      ,  Sometext1 
2      ,  Sometext2 
3      ,  Sometext3 
4      ,  Sometext4 


Ожидаемый результат

Counter,  txtfield
1      ,  Sometext1 
2      ,  Sometext2 
5      ,  Sometext3 
6      ,  Sometext4 
3      ,  Sometext1 
4      ,  Sometext0 

но я получаю

Counter,  txtfield
1      ,  Sometext1 
2      ,  Sometext2 
5      ,  Sometext3 
6      ,  Sometext4 
3      ,  Sometext1 
3      ,  Sometext0 

Так что, похоже, counter вставленный в первый цикл не обновляется во втором.
Я тестировал тот же код, используя SQL Server в качестве бэкэнда, и он работает как задумано.
Но по какой-то причине он работает по-другому с бэкэндом Access.
Я что-то упустил или это невозможно сделать, используя Access в качестве бэкэнда?

EDIT
Строка Set cmd = New ADODB.Command должна находиться внутри for цикла перед командой обновления, а не снаружи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...