使用VB6和Access 2003
我使用两个命令按钮(process、cancel)
当我运行程序时,按下取消按钮-表单立即卸载。
如果我按“处理”按钮,然后按“取消”按钮,表单不会立即卸载。
在Process按钮中,我编写了如下代码:
Getting the data from the database and creating a record set, creating a temporary table…,
有没有办法在VB代码操作数据库时立即退出程序(如创建记录集、创建临时表)?
在Cancel按钮中,我编写了以下代码
Unload me在使用数据库时,如何立即退出程序?
需要VB 6代码帮助
发布于 2009-08-12 14:30:35
它挂起的另一个原因是因为VB6正在等待数据库。您在数据库上运行的查询是长期运行的,还是VB6代码花费了很长时间?
如果数据库查询导致了问题,而您使用的是ADO,则可以使用异步数据库连接。因此,编写代码的逻辑可能会更加复杂,因为您必须设置回调方法,以便在每次数据库调用完成后继续处理。
您可以通过如下操作建立这样的连接:
Private WithEvents m_conn As ADODB.Connection
...
Set m_conn = New ADODB.Connection
Call m_conn.Open(connectionString, , , adAsyncConnect)像这样执行一个查询/存储过程--这里你会注意到的主要区别是,代码不会挂起直到查询完成,而是像往常一样继续执行):
sql = "SELECT Col1 FROM etc. etc."
Call m_conn.Execute(sql, , adAsyncExecute)取消正在运行的查询,如下所示:
Call m_conn.cancel以及查询完成时的所有重要回调:
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您可能会发现,以上内容对于您想要的东西来说过于夸张了;我之所以自己实现它,是因为该窗口是专门为执行长时间运行的查询而设计的,而且保持窗口的响应性非常重要,并且允许中途取消查询。
但是,据我所知,如果不使用异步查询方法,VB6将保持无响应状态,直到m_conn.Execute方法返回为止。
如果延迟是由于VB6代码本身造成的-例如,在创建临时表的所有工作中,那么我会同意MarkJ的“经典”答案,并使用DoEvents -尽管看起来是一个笨拙的机制,但它确实工作得很好。在整个过程中使用其中的一些,你应该会注意到一些改善。尽管可能不完美,但它可能已经足够好了。
例如:
retrieve results
...
DoEvents
...
build temporary tables
...
DoEvents每次命中一个DoEvents块时,如果用户单击Cancel按钮,则应触发该代码。
注意:当代码仍在运行时,你可能还想对卸载表单保持一点警惕,我不相信一切都会正确卸载。在这种情况下,您可能希望拥有以下内容:
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发布于 2009-08-12 11:28:47
问题可能是Cancel按钮Click事件没有触发,因为您的单个线程正在忙于处理。
一样
发布于 2012-10-12 03:31:51
简而言之,编写更多的DoEvents in Process按钮的代码。
或者使用DoEvents的替代代码,它比DoEvents更好、更快。http://nirsoft.net/vb/doevents.html
https://stackoverflow.com/questions/1264513
复制相似问题