Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ExecuteComplete ADODB Connection event not fired with adAsyncExecute parameter

I have a problem trying to catch the completion of a stored proc execute asynchronously.

Below my code VBA (in a class module named clsAsync):

Option Explicit

Private WithEvents cnn As ADODB.Connection


Private Sub cnn_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)
    MsgBox "Execution completed"
End Sub

Sub execSPAsync()
    Set cnn = New ADODB.Connection
    Set rst = New ADODB.Recordset
    cnn.ConnectionString = "connection to my database SQLSEREVER"
    cnn.Open
    cnn.Execute "kp.sp_WaitFor", adExecuteNoRecords, adAsyncExecute
End Sub

This class is PublicNotCreatable.

To call the sub execSPAsync from a module I use the following code:

Sub testASYNC()
    Dim a As New clsAsync
    Call a.execSPAsync
End Sub

The stored procedure is very simple:

alter PROC kp.sp_WaitFor
AS

WAITFOR DELAY '00:00:05'

My problem is that the event ExecuteComplete is not fired at all, while if I comment the adAsynExecute parameter all is working fine. Any idea on how to solve my question?

like image 643
stexcec Avatar asked Apr 23 '13 10:04

stexcec


People also ask

Can I use adasyncfetch and adasynchfetchnonblocking with execute?

If adExecuteStream was specified, the options adAsyncFetch and adAsynchFetchNonBlocking are ignored. Do not use the CommandTypeEnum values of adCmdFile or adCmdTableDirect with Execute. These values can only be used as options with the Open and Requery methods of a Recordset.

Do not use the commandtypeenum values of adcmdfile or adcmdtabledirect with execute?

Do not use the CommandTypeEnum values of adCmdFile or adCmdTableDirect with Execute. These values can only be used as options with the Open and Requery methods of a Recordset. Using the Execute method on a Command object executes the query specified in the CommandText property or CommandStream property of the object.

What is adexecutestream in Ado?

An ADO Stream object can be specified to receive the results, or another stream object such as the IIS Response object can be specified. If no stream was specified before calling Execute with adExecuteStream, an error occurs. The position of the stream on return from Execute is provider specific.

What is executecomplete event in Salesforce?

The ExecuteComplete event is called after a command has finished executing. A Long value indicating the number of records affected by the command. An Error object. It describes the error that occurred if the value of adStatus is adStatusErrorsOccurred; otherwise it is not set.


1 Answers

I solved my problem replacing the calling code:

Sub testASYNC()
    Dim a As New clsAsync
    Call a.execSPAsync
End Sub

with this new code:

Private a As clsAsync

Sub testASYNC()
    Set a = New clsAsync
    Call a.execSPAsync
End Sub

In the async mode, the object "a" is no longer available at the end of the procedure (scope visibility issue).

like image 153
stexcec Avatar answered Oct 15 '22 21:10

stexcec