2011-05-04 129 views
1

我遇到過一種情況,需要您的建議是否使用DoEvents()/ Any Other/Nothing to use。在VB 6.0中使用DoEvents()

我已經開發了一個應用程序在VB6.5之前5-6年,並正常工作。

現在從數據增加(MS Access)的某個時候開始,它給出了一些意想不到的結果。

我正在使用DbName.Execute「...查詢更新表...」,然後在此行之後,我使用了DoEvents(),讓D​​bName.Execute查詢先完成,然後繼續其餘的代碼。

所以它的正確使用的DoEvents()的,因爲我已經監測到,在一些先進的CPU,在運行仍然執行代碼的其餘部分的發生是由於非執行查詢/查詢的問題

我實際上想停止執行進一步的代碼,一旦執行查詢完成,然後我想執行進一步的代碼

請指導!

+0

您是否在Access中的VB6或VBA中進行編碼? – 2011-05-06 02:25:22

+0

對於「我應該在VB 6.0中使用DoEvents()」這個問題的答案當然是**否**,除了可能用於調試目的。你能編輯你的文章來顯示一些代碼,以便我們可以提供更具體的建議嗎? – 2011-05-06 10:04:23

+0

另一方面,在Access中,DoEvents在許多情況下實際上是有用的,但它不會執行此處問題中描述的內容。 – 2011-05-07 20:44:54

回答

0

是的,我有同樣的想法。你問:「是否要使用的DoEvents()

Dim i as long 
i = 0 

Do 
    i = i + 1 
    DoEvents() ' Is this what you were asking? 
Loop Until i = 5000 
5

的DAO和ADO .Execute方法均默認情況下同步工作我會做以下。換句話說,代碼的下一行不執行,直到查詢完成處理。你不需要用DoEvents或While循環或其他任何東西。

您可以強制Execute方法,通過設置選項標誌dbRunAsync in DAOadAsyncExecute in ADO異步運行。如果這些標誌設置(你不不指定您是使用DAO還是ADO),那麼只需從方法調用中刪除它們就會強制您的代碼等待在進入下一行之前完成查詢。

1

我認爲你可以通過在事務中操作來確保你的Execute操作已經完成並寫入磁盤。以下是有關事務的Access 2003 Execute Method幫助主題的說明:

爲了在Microsoft Jet工作空間中(尤其是在多用戶環境中)獲得最佳性能,請在事務中嵌套Execute方法。在當前Workspace對象上使用BeginTrans方法,然後使用Execute方法,並使用Workspace上的CommitTrans方法完成該事務。這可以保存磁盤上的更改並釋放查詢運行時放置的所有鎖。

查看一種方法是否可以消除您意想不到的結果。如果不是,請描述您希望避免的意外結果。

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