异步地执行一个SQL语句该怎么做?
有一条SQL语句会占用挺长的时间,我想异步地执行它,这样就可以响应界面,使程序不会失去响应.下面是我的程序,WillExecute和ExecuteComplete都会执行,
但是cn2.Execute这句是阻塞的,跟不用异步没什么区别啊.
Dim WithEvents cn2 As ADODB.Connection
Dim bEnd as BooleanPrivate Sub Command1_Click()
Set cn2 = New ADODB.Connection
cn2.Open ""cn2.Execute "delete from tablea where flag=1"do while not bEnd
Sleep(500)
doEvents
loopcn2.close
End SubPrivate Sub cn2_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)
bend = True
End Sub
Private Sub cn2_WillExecute(Source As String, CursorType As ADODB.CursorTypeEnum, LockType As ADODB.LockTypeEnum, Options As Long, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
bend = False
End Sub
有一条SQL语句会占用挺长的时间,我想异步地执行它,这样就可以响应界面,使程序不会失去响应.下面是我的程序,WillExecute和ExecuteComplete都会执行,
但是cn2.Execute这句是阻塞的,跟不用异步没什么区别啊.
Dim WithEvents cn2 As ADODB.Connection
Dim bEnd as BooleanPrivate Sub Command1_Click()
Set cn2 = New ADODB.Connection
cn2.Open ""cn2.Execute "delete from tablea where flag=1"do while not bEnd
Sleep(500)
doEvents
loopcn2.close
End SubPrivate Sub cn2_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)
bend = True
End Sub
Private Sub cn2_WillExecute(Source As String, CursorType As ADODB.CursorTypeEnum, LockType As ADODB.LockTypeEnum, Options As Long, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
bend = False
End Sub
很奇怪,这句如果这样写的话
cn2.Execute "delete from tablea where flag=1",,adAsyncExecute这部操作是异步的了,但是cn2_ExecuteComplete和cn2_WillExecute,这两个过程不会执行,不知道异步的操作什么时候会执行完,郁闷.
这句是对的,在等待完成的循环中必须有DoEvents,不然的话,执行结束的事件不会被响应,也就是说DoEvents的时候,cn2_ExecuteComplete才会执行.