#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
) набор записей?