ADO是支持异步查询的,option参数选择adAsyncExecute,这样就不会假死了 比如:rs.Open sql,cnn,adOpenStatic, adLockReadOnly, adAsyncExecute '如果你要等待返回记录集 do while (rs.State And adStateExecuting) = adStateExecuting doevents '这里做你想做的事 loop
你可以把代码放在Form_Activate事件中:这样窗体截稿后执行异步查询,你可以在窗口上加载动画来模拟查询进行中,也可以do...loop中用一个进度条百精确的来模拟进度...Private Sub Form_Activate() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String
sql = "......" '连接数据库 set cn=New ADODB.Connection cn.open... '异步执行查询 Set rs = New Recordset rs.CursorLocation = adUseClient rs.Open sql, cn, adOpenStatic, adLockReadOnly, adAsyncExecute Do DoEvents '可以在这儿模拟进度 Loop Until (rs.State And adStateOpen) '记录集返回后关闭动画或模拟进度的代码,或者填充表格的代码放这儿 print rs.State set rs=nothing set cn=nothing End Sub
比如:rs.Open sql,cnn,adOpenStatic, adLockReadOnly, adAsyncExecute
'如果你要等待返回记录集
do while (rs.State And adStateExecuting) = adStateExecuting
doevents
'这里做你想做的事
loop
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String
sql = "......"
'连接数据库
set cn=New ADODB.Connection
cn.open...
'异步执行查询
Set rs = New Recordset
rs.CursorLocation = adUseClient
rs.Open sql, cn, adOpenStatic, adLockReadOnly, adAsyncExecute
Do
DoEvents
'可以在这儿模拟进度
Loop Until (rs.State And adStateOpen)
'记录集返回后关闭动画或模拟进度的代码,或者填充表格的代码放这儿
print rs.State
set rs=nothing
set cn=nothing
End Sub