>*!* ADO CursorAdapter Example for the SQL Server 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 >*!* SUSPEND >oXC.RELEASE() >RETURN > > >DEFINE CLASS xcADO AS CURSORADAPTER > > lUseMSDE = .F. > nTableUpdateType = 0 && First parameter value for TABLEUPDATE() > > *!* 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. > > *!* RTRIM() is needed for an earlier provider that had a bug where > *!* the parameter was right padded with spaces to the width of the field > *!* This has since been fixed, so if you have a more current provider > *!* you can try removing the RTRIM(). If you do and get no results, > *!* RTRIM the parameter and try again. > SELECTCMD = [SELECT * FROM Customers WHERE CompanyName LIKE RTRIM(?cCompany) ORDER BY CompanyName] > WHERETYPE = 3 > > lFilled = .F. > DIMENSION aErrorInfo(1) > DIMENSION aUpdateInfo(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 > IF THIS.lUseMSDE > .ConnectionString = ; > [Provider=SQLOLEDB.1;Integrated Security=SSPI;] ; > + [Persist Security Info=False;] ; > + [Initial Catalog=Northwind;Data Source=localhost] > ELSE > .ConnectionString = [Provider=VFPOLEDB.1;Data Source=] + ADDBS(_SAMPLES) ; > + [Northwind\;Mode=ReadWrite|Share Deny None;] > ENDIF > .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 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 = .T. > IF THIS.nTableUpdateType = 0 > LOCAL nRecord > nRecord = GETNEXTMODIFIED(0) > DO WHILE nRecord > 0 > GOTO nRecord IN crsCustomers > THIS.lSaved = TABLEUPDATE(0, .F., 'crsCustomers') > IF NOT THIS.lSaved > THIS.nError = AERROR(THIS.aErrorInfo) > EXIT > ENDIF > nRecord = GETNEXTMODIFIED(nRecord) > ENDDO > ELSE > THIS.lSaved = TABLEUPDATE(THIS.nTableUpdateType, .F., 'crsCustomers') > IF NOT THIS.lSaved > THIS.nError = AERROR(THIS.aErrorInfo) > EXIT > ENDIF > 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 = [CompanyName RTRIM,] ; > + [ContactName RTRIM,] ; > + [ContactTitle RTRIM,] ; > + [Address RTRIM,] ; > + [City RTRIM,] ; > + [Region RTRIM,] ; > + [PostalCode RTRIM,] ; > + [Country RTRIM,] ; > + [Phone RTRIM,] ; > + [Fax RTRIM] > ENDWITH > ELSE > WITH THIS > .KEYFIELDLIST = [] > .TABLES = [] > .UPDATABLEFIELDLIST = [] > .UPDATENAMELIST = [] > .CONVERSIONFUNC = [] > .UPDATECMD = [UPDATE Customers SET ] ; > + [CompanyName = ?RTRIM(crsCustomers.CompanyName), ] ; > + [ContactName = ?RTRIM(crsCustomers.ContactName), ] ; > + [ContactTitle = ?RTRIM(crsCustomers.ContactTitle), ] ; > + [Address = ?RTRIM(crsCustomers.Address), ] ; > + [City = ?RTRIM(crsCustomers.City), ] ; > + [Region = ?RTRIM(crsCustomers.Region),] ; > + [PostalCode = ?crsCustomers.PostalCode, ] ; > + [Country = ?RTRIM(crsCustomers.Country), ] ; > + [Phone = ?RTRIM(crsCustomers.Phone), ] ; > + [Fax = ?RTRIM(crsCustomers.Fax) ] ; > + [WHERE CustomerID = ?crsCustomers.CustomerID] > .INSERTCMD = [INSERT INTO Customers ( ] ; > + [CustomerID, ] ; > + [CompanyName, ] ; > + [ContactName, ] ; > + [ContactTitle, ] ; > + [Address, ] ; > + [City, ] ; > + [Region, ] ; > + [PostalCode, ] ; > + [Country, ] ; > + [Phone, ] ; > + [Fax ] ; > + [) ] ; > + [values ( ] ; > + [?RTRIM(crsCustomers.CustomerID), ] ; > + [?RTRIM(crsCustomers.CompanyName), ] ; > + [?RTRIM(crsCustomers.ContactName), ] ; > + [?RTRIM(crsCustomers.ContactTitle), ] ; > + [?RTRIM(crsCustomers.Address), ] ; > + [?RTRIM(crsCustomers.City), ] ; > + [?RTRIM(crsCustomers.Region), ] ; > + [?RTRIM(crsCustomers.PostalCode), ] ; > + [?RTRIM(crsCustomers.Country), ] ; > + [?RTRIM(crsCustomers.Phone), ] ; > + [?RTRIM(crsCustomers.Fax) ] ; > + [)] > .DELETECMD = [DELETE FROM Customers WHERE CustomerID = ?crsCustomers.CustomerID] > ENDWITH > ENDIF > ENDPROC >ENDDEFINE >