*!* ADO CursorAdapter Example for Oracle table of the following structure: *!* CREATE TABLE AppUsers *!* (KeyID NUMBER(4), *!* LoginID VARCHAR2(8), *!* LastName VARCHAR2(30), *!* FirstName VARCHAR2(30), *!* Manager NUMBER(1), *!* Enforcement NUMBER(1)) *!* *!* You should also have an Oracle Insert trigger and sequence *!* to populate the KeyID column when new records are inserted. *!* LOCAL oXC oXC = CREATEOBJECT('xcADO') *!* oXC.lAutoGenerateSQL = .T. *!* oXC.lUseCursorSchema = .T. oXC.GetOracleData() IF oXC.lFilled LIST STRUCTURE BROWSE oXC.SaveData() IF oXC.lSaved MESSAGEBOX('Save worked.') ELSE MESSAGEBOX('Save failed.') CLEAR ? ? oXC.aErrorInfo(1) ? oXC.aErrorInfo(2) ENDIF ELSE MESSAGEBOX('CursorFill Failed') CLEAR ? ? oXC.aErrorInfo(1) ? oXC.aErrorInfo(2) ENDIF oXC.RELEASE() DEFINE CLASS xcADO AS CURSORADAPTER *!* Change lUseCursorSchema to .T. to create a cursor according to the CursorSchema property lUseCursorSchema = .F. *!* Set the following property to .F. if you want the adapter to use your own SQL found *!* in the InsertCmd, UpdateCmd and DeleteCmd properties. See Assign method below. lAutoGenerateSQL = .T. ALIAS = [crsUsers] CURSORSCHEMA = [keyid n(4),loginid c(8),lastname c(30),firstname c(30),manager N(1),enforcement N(1)] BUFFERMODEOVERRIDE = 5 DATASOURCETYPE = [ADO] ALLOWUPDATE = .T. ALLOWDELETE = .T. ALLOWINSERT = .T. SELECTCMD = [select * from appusers order by lastname, firstname] WHERETYPE = 1 lFilled = .F. DIMENSION aErrorInfo(1) nError = 0 lSaved = .F. PROTECTED PROCEDURE INIT CLEAR THIS.ADDPROPERTY('oConn', NEWOBJECT('ADODB.Connection')) THIS.ADDPROPERTY('oRS', NEWOBJECT('ADODB.Recordset')) THIS.ADDPROPERTY('oCommand', NEWOBJECT('ADODB.Command')) WITH THIS.oConn .CursorLocation = 3 .ConnectionString = ; [Driver=Microsoft ODBC for Oracle;UID=myid;PWD=mypwd;Server=hostname;] .OPEN() ENDWITH THIS.oCommand.ActiveConnection = THIS.oConn WITH THIS.oRS .ActiveConnection = THIS.oConn .CursorType = 1 && adOpenKeyset .CursorLocation = 3 && adUseClient .LockType = 3 && adLockOptimistic ENDWITH THIS.DATASOURCE = THIS.oRS THIS.UPDATECMDDATASOURCETYPE = [ADO] THIS.UPDATECMDDATASOURCE = THIS.oCommand THIS.DELETECMDDATASOURCETYPE = [ADO] THIS.DELETECMDDATASOURCE = THIS.oCommand THIS.INSERTCMDDATASOURCETYPE = [ADO] THIS.INSERTCMDDATASOURCE = THIS.oCommand THIS.lAutoGenerateSQL = .F. && needed to initially fire the Assign method for this property ENDPROC PROCEDURE GetOracleData THIS.ResetError() THIS.lFilled = THIS.CURSORFILL(THIS.lUseCursorSchema) IF NOT THIS.lFilled THIS.nError = AERROR(THIS.aErrorInfo) ENDIF ENDPROC PROCEDURE SaveData THIS.ResetError() THIS.lSaved = TABLEUPDATE(1, .F., 'crsUsers') IF NOT THIS.lSaved THIS.nError = AERROR(THIS.aErrorInfo) ENDIF ENDPROC PROTECTED PROCEDURE ResetError THIS.nError = 0 THIS.aErrorInfo = [] ENDPROC PROTECTED PROCEDURE DESTROY THIS.oRS = .NULL. THIS.oConn = .NULL. THIS.oCommand = .NULL. ENDPROC PROCEDURE RELEASE RELEASE THIS ENDPROC PROTECTED PROCEDURE lAutoGenerateSQL_Assign LPARAMETERS tlAuto IF VARTYPE(tlAuto) <> "L" RETURN .f. ENDIF THIS.lAutoGenerateSQL = tlAuto IF tlAuto WITH THIS .KEYFIELDLIST = [KeyID] .TABLES = [AppUsers] .UPDATECMD = [] .INSERTCMD = [] .DELETECMD = [] .UPDATABLEFIELDLIST = [LoginID, FirstName, LastName, Manager, Enforcement] .UPDATENAMELIST = [KEYID AppUsers.KeyID, LoginID AppUsers.LoginID, ] ; + [FIRSTNAME AppUsers.FirstName, LASTNAME AppUsers.LastName, ] ; + [MANAGER AppUsers.Manager, ENFORCEMENT AppUsers.Enforcement ] .CONVERSIONFUNC = [LoginID RTRIM, FirstName RTRIM, Lastname RTRIM] ENDWITH ELSE WITH THIS .UPDATABLEFIELDLIST = [] .UPDATENAMELIST = [] .CONVERSIONFUNC = [] .UPDATECMD = [update appusers set ] ; + [loginid = ?RTRIM(crsUsers.LoginID), ] ; + [firstname = ?RTRIM(crsUsers.FirstName), ] ; + [lastname = ?RTRIM(crsUsers.LastName), ] ; + [manager = ?crsUsers.Manager), ] ; + [enforcement = ?crsUsers.Enforcement) ] ; + [where keyid = ?crsUsers.KeyID] .INSERTCMD = [insert into appusers (LoginID, LastName, FirstName, Manager, Enforcement) ] ; + [values ] ; + [(RTRIM(?crsUsers.LoginID), RTRIM(?crsUsers.LastName), RTRIM(?crsUsers.FirstName), ] ; + [?crsUsers.Manager, ?crsUsers.Enforcement)] .DELETECMD = [delete from appusers where keyid = ?crsUsers.KeyID] ENDWITH ENDIF ENDPROC ENDDEFINE