使用VB 6和Access 2003
我正在使用两个命令按钮(进程,取消)
当我运行程序时,按取消按钮 - 表单立即卸载.
如果我按下"处理"按钮,然后按"取消"按钮,则表单不会立即卸载.
在Process按钮中,我写了这样的代码:
Getting the data from the database and creating a record set, creating a temporary table…,
有没有办法在VB代码使用数据库时立即退出程序(如创建记录集,创建临时表)?
在"取消"按钮中,我编写了此代码
Unload me
Run Code Online (Sandbox Code Playgroud)
如何在使用数据库时立即退出程序?
需要VB 6代码帮助
它可能挂起的另一个原因是VB6正在等待数据库.您在数据库上运行的查询是长期运行的,还是需要很长时间的VB6代码?
如果数据库查询导致问题并且您正在使用ADO,则可以使用异步数据库连接.然后,编码的逻辑可能会更复杂,因为您必须设置回调方法以在每次数据库调用完成后继续处理.
您可以建立这样的连接,执行以下操作:
Private WithEvents m_conn As ADODB.Connection
...
Set m_conn = New ADODB.Connection
Call m_conn.Open(connectionString, , , adAsyncConnect)
Run Code Online (Sandbox Code Playgroud)
执行这样的查询/存储过程 - 这里你会注意到的主要区别是,在查询完成之前,代码执行将继续正常进行:
sql = "SELECT Col1 FROM etc. etc."
Call m_conn.Execute(sql, , adAsyncExecute)
Run Code Online (Sandbox Code Playgroud)
取消正常运行的查询:
Call m_conn.cancel
Run Code Online (Sandbox Code Playgroud)
以及查询完成时的所有重要回调:
Private Sub m_conn_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
... do more processing etc...
End Sub
Run Code Online (Sandbox Code Playgroud)
你可能会发现上述内容对你想要的东西来说太过分了; 我自己实现了这个,因为窗口专门用于执行长时间运行的查询,窗口保持响应非常重要,并且允许在中途取消查询.
但据我所知,如果您不使用异步查询方法,VB6将保持无响应,直到您的m_conn.Execute方法返回.
如果由于VB6代码本身而发生延迟 - 例如在你正在创建临时表的所有工作中,那么我同意MarkJ的"经典"答案并使用DoEvents - 虽然看似笨拙的机制,但确实有效挺好的.在整个过程中撒上一些,你应该注意到一些改进.虽然可能不完美,但可能还不错.
例如
retrieve results
...
DoEvents
...
build temporary tables
...
DoEvents
Run Code Online (Sandbox Code Playgroud)
每次击中其中一个DoEvents块时,如果用户单击了取消按钮,该代码应该触发.
注意:您可能还希望在代码仍在运行时对卸载表单有点警惕,我不相信一切都会正常卸载.在这种情况下,你可能希望有类似的东西:
Private m_cancel as Boolean
Private Sub cmdCancel_Click()
m_cancel = True
End Sub
Private Sub cmdProcess_Click()
...
retrieve results
...
DoEvents
If Not m_cancel Then
... build temporary tables etc...
End if
If m_cancel Then Unload Me
End Sub
Run Code Online (Sandbox Code Playgroud)
尝试:
结束
| 归档时间: |
|
| 查看次数: |
23166 次 |
| 最近记录: |