我有一个案例,需要你的建议是否使用DoEvents()/ Any Other / Nothing来使用。
我在5-6岁之前在VB 6.0中开发了一个应用程序并且工作正常。
现在,随着数据的增加(MS Access),它会产生一些意想不到的结果。
我正在使用DbName.Execute“...查询更新表...”然后在此行之后我使用了DoEvents(),让DbName.Execute Query先完成然后再继续代码。
所以它是DoEvents()的正确用法,正如我在某些高级CPU中监视的那样,由于未执行查询/查询而导致出现问题仍然执行其余的代码
我实际上想要停止执行更多代码,一旦完全执行查询,那么我想执行更多代码
请指导!
答案 0 :(得分:5)
DAO和ADO .Execute
方法默认同步运行。换句话说,在查询完成处理之前,下一行代码不会执行。您不需要使用DoEvents
或While循环或其他任何内容。
您可以通过设置选项标记dbRunAsync
in DAO或adAsyncExecute
in ADO来强制Execute
方法异步运行。如果设置了这些标志中的任何一个(您没有指定是使用DAO还是ADO),那么只需从方法调用中删除它们将强制您的代码等到查询完成后再转到下一行。
答案 1 :(得分:1)
我认为您可以通过在事务中操作来确保您的Execute操作已完成并写入磁盘。以下是Access 2003执行方法帮助主题关于事务的说明:
为了在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
答案 2 :(得分:0)
是的,我有同样的想法。当你问“是否使用DoEvents()
时,我会做以下事情Dim i as long
i = 0
Do
i = i + 1
DoEvents() ' Is this what you were asking?
Loop Until i = 5000