Other 3: Events
<< Click to Display Table of Contents >> Other 3: Events |
|
This sample is designed to show you some of the recordset and connection events.
It implements two event handlers:
•MyConnectionEvents
•MyRecordSetEvents.
The only thing the methods of these event handlers do is to show that they are being called and to show their parameters like you can see below:
METHOD BeginTransComplete(lTransactionLevel , oError , lStatus , ;
oConnection) CLASS MyConnectionEvents
WriteLog( "BeginTrans", lTransactionLevel , lStatus , oConnection)
METHOD FieldChangeComplete (nFields , uFields , oError, lStatus, ;
oRecordSet) CLASS MyRecordSetEvents
WriteLog( "FieldChangeComplete", nFields , uFields , lStatus, oRecordSet)
IF IsArray(uFields)
AEval(uFields, {|oFld|WriteLog(" > Field", ;
oFld:Name, OFld:Value, OFld:OriginalValue)})
ENDIF
The WriteLog() function write the results to the console and to a logfile.
The main program shows how to open a connection Asynchronous and Synchronous:
oConn := AdoConnection{}
AdoSetConnection(oConn)
oConnEvents := MyConnectionEvents{}
oConn:EnableEvents(oConnEvents)
// Set the connection for better error reports
WriteLog("ASynchronous open")
AdoSetConnection(oConn)
oConn:CursorLocation := adUseClient
oConn:Open(strCnn,NIL,NIL,adAsyncConnect )
DO WHILE oCOnn:State != adStateOPen
WriteLog("Connecting...")
Sleep(10)
ENDDO
oConn:Close()
WriteLog("Now normal Synchronous open")
oCOns:WriteLine("Enter to continue")
oCOns:Read()
oConn:Open(strCnn,NIL,NIL,NIL)
It also shows how to display the fetch progress of a recordset:
oRstEvents := MyRecordSetEvents {}
oRs:EnableEvents(oRstEvents)
oRs:CursorLocation := AdUseClient
oRs:Properties:[Item,"Initial Fetch Size"]:Value := 0
oRs:Properties:[Item,"Background Fetch Size"]:Value := 5
WriteLog("The recordset is opened. " )
WriteLog("A fetchprogress will be called on ANOTHER THREAD for every 5 rows")
oCons:WriteLine("Enter to continue")
oCOns:Read()
oRs:Open("employee",oConn,adOpenKeySet,AdLockOptimistic,adCmdTable+AdAsyncFetch)
DO WHILE oRs:State != AdStateOpen .and. oRs:State <> AdStateClosed
WriteLog("Fetching")
Sleep(5)
ENDDO
Please note that this will cause a second thread to be started. Be very careful with what you do in the second thread. Accessing GUI objects will certainly cause runtime errors, since the X# GUI classes are NOT threadsafe !