Необходимо (принудительно) обновить базу данных MS Access сразу после инструкции delete

#ms-access #vb6

#ms-access #vb6

Вопрос:

Я использую базу данных MS Access. В приведенном ниже коде я перебираю набор записей и удаляю каждую запись. Непосредственно после инструкции delete функция RefreshPlanning выполняет запрос select на основе той же таблицы. Проблема в том, что запись в таблице не удаляется мгновенно, и поэтому планирование обновления запрашивает некоторую запись, которая обычно была удалена! Итак, мне нужно обновить базу данных (очистить кэш?) Сразу после инструкции delete. Как я могу продолжить?

     Dim rstTraitements as ADODB.Recordset
    Set rstTraitements = SelectQuery("SELECT * FROM tblTraitements WHERE ID like 123")

    ' Loop through all selected elements.
    While Not rstTraitements.EOF
       ' Delete current record in the table.
       rstTraitements.Delete
       MsgBox "a database refresh is needed here before the next statement"
       RefreshPlanning DatePlanning, CodeEquipement           
       rstTraitements.MoveNext
    Wend
  

Замечание 1: SelectQuery — это функция, которая возвращает набор записей

Замечание 2: Планирование обновления — это функция, которая выполняет запрос select на основе той же таблицы (tblTraitements).

Спасибо за вашу помощь.

Комментарии:

1. Вы выполняете все эти операции с одним подключением?

2. Открытие набора записей для удаления каждой строки неэффективно. Может ли сработать замена CurrentDb.Execute "DELETE FROM tblTraitements WHERE ID = 123" , а затем запустить вашу функцию планирования обновления один раз после удаления строк?

3. @HansUp — Совершенно верно, но если вы все равно открываете набор записей, для дальнейшей обработки вы могли бы также выполнить удаление там.

4. Если использование одного и того же набора записей для обеих целей вызывает эту проблему, то мне кажется, что нецелесообразно делать это таким образом. Я просто не вижу причин выполнять удаления путем обхода набора записей. Я подозреваю, что этот код можно было бы легко переделать, чтобы избавиться от обеих проблем, но поскольку мы не знаем, что RefreshPlanning DatePlanning, CodeEquipement делает, невозможно предложить решение.

5. @Bob: Да, только одно соединение. Но эта проблема решается с помощью запроса к набору записей. В любом случае, спасибо.

Ответ №1:

Попробуйте

 rstTraitements.Resync
  

или

 rstTraitements.Requery
  

после удаления

Комментарии:

1. Это работает с запросом. Одним из недостатков является то, что мне нужно заменить инструкцию rstTraitements. Далее двигайтесь по , если не по rstTraitements. EOF затем rstTraitementrs.MoveFirst в противном случае одна запись отсутствует. Что вы думаете?

2. Это должно быть нормально. В качестве альтернативы, вы, вероятно, можете изменить цикл на Do While True , заменить MoveNext на If rstTraitements.EOF Then Exit Do и заменить Wend на Loop

3. Requery фактически снова выполняется вся инструкция SELECT. Похоже на серьезное снижение производительности. Вы пробовали вызывать Update (после Delete ) набор записей?