Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
How to use the CursorAdapter
Message
 
 
To
06/11/2002 14:42:09
Robert Lee
Swiderski Electronics, Inc.
Carol Stream, Illinois, United States
General information
Forum:
Visual FoxPro
Category:
Other
Miscellaneous
Thread ID:
00719501
Message ID:
00722983
Views:
49
Here is the complete example code that works in Oracle. However, using the CursorSchema property for Oracle tables does not work yet.
*!* 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
Mark McCasland
Midlothian, TX USA
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform