7 |
The LA Fox Developer Newsletter
|
ADO
Jumpstart
(Con’t from page 6)
EndWith
Next oError
Endif
On Error &cOldErr
If you are thinking, “Hey, maybe I should write a wrapper class to
better
encapsulate and centralize code,” you’re on the right track. The following code creates a custom class that can serve as a starting point:
Local oRecordsetHandler oRecordsetHandler
=
CreateObject("RecordsetHandler") oRecordset.FieldS(”COmpaflyflame”).VaIUe
If loRecordsetHandler.Update(OReCOrdSet)
oRecordsetHandler.canCel(OReCOrdSet)
Endif
Define Class RecordsetHandler As Custom
Protected oRecordset
Protected ErrFlag
Procedure Update(oRecordset) This.oRecordset
=
oRecordset oRecordset.UpdateBatch Return !This.ErrFlag
EndProc
Procedure Cancel(oRecordset) This.oRecordset
=
oRecordset oRecordset.Cancel
Return !ThIs.ErrFlag
EndProc
Procedure Error(nError, cMethod, nLine)
Local oError
For Each oError In;
This.oRecordset.ActlveConnectiOfl.ErrOrS
With oError
?.Number,.Description
End
With
Next oError
Thls.ErrFlag
=
.T.
EndProc
EndDeflne
There’s a better way to determine whether an update proceeded successfully. The preferred approach is to trap events that ADO fires. Visual FoxPro by itself does not surface COM Events. Fortunately, the new VFPCOM. DLL component provides this capability to Visual FoxPro. The previous example
can
be modified to show how using COM Events makes for more robust code and class design.
Now we can improve the code of our example. Most of the time, for efficiency, you will want to batch your updates that comprise multiple records. Often, when you update multiple records, transaction processing is required. In other words, either updates to all records must succeed or none should occur. To illustrate, let’s say you must apply a 10 percent price increase to the products you sell. The prime requirement is that all records in the Products table need modification. Without transactional capabilities, the possibility exists that, for example, after the first 10 records are updated, an
error
generated
|
April 2000
on the eleventh record prevents a complete update. Transaction processing provides the ability to rollback changes.
The following example incorporates
error
trapping and the three transaction methods of the Connection object:
Local
Err,cOldErr
cOldErr
=
On(”error”) On Error
Err
=
.T.
oRecordset.Activeconnection.Begl nTra ns
Do While !oRecordset.Eof
If Err
Exit
Else
With oRecordset
.Fields(”unitprlce”).Value
=;
.Fields(”unitprice”).Value
*
1.1
.Movenext
EndWith
Endif
EndDo
oRecordSet.UpdateBatch
If Err
oRecordset.ActiveConnection.RollBackTrans
oRecordset.CancelBatch
Else
oRecordset.ActiveConnectlon.Com mitTrans
Endif
On Error &cOldErr
Additional operations you are likely to employ with recordsets deal with adding new records and deleting existing records. Both of these processes are very simple. The following code adds a new record:
oRecordset.AddNew
As in Visual FoxPro, in ADO the new record becomes current.
Once the Add New method is invoked, the field can be populated
and, depending on the LockType, you then invoke either the
Update or UpdateBatch methods to modify the data source.
Deleting records is just as easy. The following code deletes the current record:
oRecordset.Detete
Once again, after deleting the record, a call to Update or UpdateBatch will update the data source.
|
Page
7
|
7 |