Пакетное обновление ADO в Access VBA - PullRequest
1 голос
/ 25 июня 2009

Я пытаюсь использовать пакетные обновления в Access VBA. Мой код работает нормально, когда я обновляюсь после каждой операции, но не работает, когда я пытаюсь работать с несколькими строками. Я получаю исключение

«Ошибка времени выполнения -2147217887 (80040e21)»: при многоэтапной операции OLE DB возникли ошибки. Проверьте значение каждого состояния OLE DB, если оно доступно. Никаких работ не было. "

Мой код

rs.Open "dbrammDump", CurrentProject.Connection, _
            adOpenKeyset, adLockBatchOptimistic
rowsDel = 0
Do Until rs.RecordCount < 1
    rs.MoveFirst
    rs.Delete

    rowsDel = rowsDel + 1
Loop
rs.UpdateBatch

Есть идеи, в чем проблема?

Ответы [ 3 ]

1 голос
/ 26 июня 2009

Является ли источник ваших вставок набором данных, который можно использовать в операторе SELECT для добавления в виде пакета? Если так, то это ваш ответ.

Если вам нужно удалить / вставить / обновить количество строк с помощью кода ADO, используйте следующее.

CurrentProject.Connection.Execute strSQL, lngRecordsAffected, adCmdText
1 голос
/ 26 июня 2009

Я думаю, что проблема в том, что вам нужно явно использовать курсор на стороне клиента. Я подозреваю, что вы неявно используете серверный курсор.

Я предпочитаю устанавливать свойства объекта набора записей по отдельности, потому что я думаю, что легче читать (и, следовательно, отлаживать), чем использовать перегруженный метод Open. Кроме того, вы можете использовать свойство RecordCount для вашего цикла, например

With rs
  .ActiveConnection = CurrentProject.Connection
  .Source = "dbrammDump"
  .CursorLocation = adUseClient  ' <<< THIS MISSING FROM ORIGINAL CODE
  .CursorType = adOpenKeyset
  .LockType = adLockBatchOptimistic
  .Open

  Dim counter As Long
  For counter = 0 To .RecordCount - 1
      .Delete
      .MoveNext
  Next

  .UpdateBatch

  rowsDel = counter

End With

FWIW Я согласен с другими здесь, что основанное на множестве решение в SQL предпочтительнее процедурного кода, такого как приведенный выше.

1 голос
/ 25 июня 2009

Почему вы удаляете записи таким способом, когда вы можете позвонить myconnection.Execute "DELETE FROM myTable WHERE....."?

Кроме того, как вы открыли набор записей? Вставьте сюда оператор myrecordset.Open(...).
Посмотрите, поможет ли эта ссылка .

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