*!* ADO CursorAdapter Example for the VFP Northwind sample database *!* LOCAL oXC oXC = CREATEOBJECT('xcADO') oXC.lAutoGenerateSQL = .F. oXC.lUseCursorSchema = .F. oXC.GetSQLData() CLEAR IF oXC.lFilled LIST STRUCTURE BROWSE oXC.SaveData() IF oXC.lSaved MESSAGEBOX('Save worked.') ELSE MESSAGEBOX('Save failed.') ? ? 'Save Failed' ? oXC.aErrorInfo(1) ? oXC.aErrorInfo(2) _CLIPTEXT = oXC.aErrorInfo(2) ENDIF ELSE MESSAGEBOX('CursorFill Failed') ? ? 'CursorFill Failed' ? oXC.aErrorInfo(1) ? oXC.aErrorInfo(2) _CLIPTEXT = oXC.aErrorInfo(2) ENDIF oXC.cCompanyName = 'T%' oXC.NewData() IF oXC.lFilled CLEAR LIST STRUCTURE BROWSE oXC.SaveData() IF oXC.lSaved MESSAGEBOX('Save worked.') ELSE MESSAGEBOX('Save failed.') ? ? 'Second save failed' ? oXC.aErrorInfo(1) ? oXC.aErrorInfo(2) ENDIF ELSE MESSAGEBOX('CursorRefresh Failed') ? ? 'CursorRefresh failed' ? 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. cCompanyName = 'M%' *!* 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. *!* Set it to .T. if you want VFP to auto-generate the SQL commands. lAutoGenerateSQL = .F. ALIAS = [crsCustomers] CURSORSCHEMA = [CustomerID C(5),CompanyName C(40),ContactName C(30),ContactTitle C(30),] ; + [Address C(60),City C(15),Region C(15),PostalCode C(10),Country C(15),Phone C(24),] ; + [Fax C(24)] BUFFERMODEOVERRIDE = 5 DATASOURCETYPE = [ADO] ALLOWUPDATE = .T. ALLOWDELETE = .T. ALLOWINSERT = .T. SELECTCMD = [SELECT * FROM Customers WHERE ] ; + [CompanyName LIKE ?cCompany ORDER BY CompanyName] 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 = [Provider=VFPOLEDB.1;Data Source=] ; + ADDBS(_SAMPLES) ; + [Northwind\;Mode=ReadWrite|Share Deny None;] .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. && need to initially fire Assign method ENDPROC PROCEDURE GetSQLData THIS.ResetError() PRIVATE cCompany cCompany = THIS.cCompanyName THIS.lFilled = THIS.CURSORFILL(THIS.lUseCursorSchema, .F., -1, THIS.oCommand) IF NOT THIS.lFilled THIS.nError = AERROR(THIS.aErrorInfo) ENDIF ENDPROC PROCEDURE SaveData THIS.ResetError() THIS.lSaved = TABLEUPDATE(1, .F., 'crsCustomers') IF NOT THIS.lSaved THIS.nError = AERROR(THIS.aErrorInfo) ENDIF ENDPROC PROCEDURE NewData PRIVATE cCompany cCompany = THIS.cCompanyName THIS.lFilled = THIS.CURSORREFRESH() IF NOT THIS.lFilled 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 = [CustomerID] .TABLES = [Customers] .UPDATECMD = [] .INSERTCMD = [] .DELETECMD = [] .UPDATABLEFIELDLIST = [CompanyName,] ; + [ContactName,] ; + [ContactTitle,] ; + [Address,] ; + [City,] ; + [Region,] ; + [PostalCode,] ; + [Country,] ; + [Phone,] ; + [Fax] .UPDATENAMELIST = [CustomerID Customers.CustomerID,] ; + [CompanyName Customers.CompanyName,] ; + [ContactName Customers.ContactName,] ; + [Contacttitle Customers.ContactTitle,] ; + [Address Customers.Address,] ; + [City Customers.City,] ; + [Region Customers.Region,] ; + [Postalcode Customers.PostalCode,] ; + [Country Customers.Country,] ; + [Phone Customers.Phone,] ; + [Fax Customers.Fax] .CONVERSIONFUNC = [] ENDWITH ELSE WITH THIS .KEYFIELDLIST = [] .TABLES = [] .UPDATABLEFIELDLIST = [] .UPDATENAMELIST = [] .CONVERSIONFUNC = [] .UPDATECMD = [UPDATE Customers SET ] ; + [CompanyName = ?crsCustomers.CompanyName, ] ; + [ContactName = ?crsCustomers.ContactName, ] ; + [ContactTitle = ?crsCustomers.ContactTitle, ] ; + [Address = ?crsCustomers.Address, ] ; + [City = ?crsCustomers.City, ] ; + [Region = ?crsCustomers.Region,] ; + [PostalCode = ?crsCustomers.PostalCode, ] ; + [Country = ?crsCustomers.Country, ] ; + [Phone = ?crsCustomers.Phone, ] ; + [Fax = ?crsCustomers.Fax ] ; + [WHERE CustomerID = ?crsCustomers.CustomerID] .INSERTCMD = [INSERT INTO Customers ( ] ; + [CustomerID, ] ; + [CompanyName, ] ; + [ContactName, ] ; + [ContactTitle, ] ; + [Address, ] ; + [City, ] ; + [Region, ] ; + [PostalCode, ] ; + [Country, ] ; + [Phone, ] ; + [Fax ] ; + [) ] ; + [values ( ] ; + [?crsCustomers.CustomerID, ] ; + [?crsCustomers.CompanyName, ] ; + [?crsCustomers.ContactName, ] ; + [?crsCustomers.ContactTitle, ] ; + [?crsCustomers.Address, ] ; + [?crsCustomers.City, ] ; + [?crsCustomers.Region, ] ; + [?crsCustomers.PostalCode, ] ; + [?crsCustomers.Country, ] ; + [?crsCustomers.Phone, ] ; + [?crsCustomers.Fax ] ; + [)] .DELETECMD = [DELETE FROM Customers WHERE ] ; + [CustomerID = ?crsCustomers.CustomerID] ENDWITH ENDIF ENDPROC ENDDEFINE