Использование DoEvents () в VB 6.0 - PullRequest
1 голос
/ 04 мая 2011

У меня один случай, и мне нужен ваш совет, использовать ли DoEvents () / Any Other / Ничего не использовать.

Я разработал приложение на VB 6.0 до 5-6 лет и работает нормально.

Теперь С некоторого времени, когда данные увеличиваются (MS Access), это дает неожиданный результат.

Я использую DbName.Execute "... Запрос на обновление таблиц ...", а затем после этой строки я использовал DoEvents (), чтобы сначала выполнить запрос DbName.Execute, а затем продолжить работу с остальными. кода.

Так ли это правильное использование DoEvents (), так как я наблюдал, что в некоторых Advanced CPU проблемы возникают из-за неисполнения Query / Query выполняется Все еще остальная часть кода выполняется

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

Пожалуйста, руководство!

Ответы [ 3 ]

5 голосов
/ 04 мая 2011

Методы DAO и ADO .Execute по умолчанию работают синхронно.Другими словами, следующая строка кода не выполняется, пока запрос не завершит обработку.Вам не нужно использовать DoEvents или While Loops или что-либо еще.

Вы можете заставить метод Execute работать асинхронно, установив флаг опции dbRunAsync в DAO илиadAsyncExecute в ADO .Если любой из этих флагов установлен (вы не указываете, используете ли вы DAO или ADO), то простое удаление их из вызова метода заставит ваш код ждать, пока запрос не будет выполнен, прежде чем перейти к следующей строке.

1 голос
/ 04 мая 2011

Я думаю, что вы можете убедиться, что ваша операция Execute была завершена и записана на диск, управляя ею в рамках транзакции.Вот что говорит справка по методу Access 2003 Execute Method о транзакциях:

Для лучшей производительности в рабочем пространстве Microsoft Jet, особенно в многопользовательской среде, вложите метод Execute в транзакцию.Используйте метод BeginTrans в текущем объекте Workspace, затем используйте метод Execute и завершите транзакцию, используя метод CommitTrans в Workspace.Это сохраняет изменения на диске и освобождает любые блокировки, установленные во время выполнения запроса.

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

    Dim objWorkspace As DAO.Workspace
    Dim db As DAO.Database
    Dim strSql As String

On Error GoTo ErrorHandler

    Set objWorkspace = DBEngine.Workspaces(0)
    Set db = CurrentDb
    objWorkspace.BeginTrans

    strSql = "UPDATE YourTable SET some_field = Null;"
    db.Execute strSql, dbFailOnError
    '* additional db.Execute operations if desired *'
    objWorkspace.CommitTrans

ExitHere:
    On Error GoTo 0
    Set db = Nothing
    Set objWorkspace = Nothing
    Exit Sub

ErrorHandler:
    objWorkspace.Rollback
    GoTo ExitHere
0 голосов
/ 04 мая 2011

Да, у меня та же идея.Я бы сделал следующее, как вы спросили "использовать ли DoEvents ()

Dim i as long
i = 0

Do
  i = i + 1
   DoEvents() ' Is this what you were asking?
Loop Until i = 5000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...