I have a number of routines in a Access 2003 application I am working on that are purely for data retrieval. No data editing or revision and the records are read in the order returned.
The structure and function of these routines is all the same. They are called interactively from another routine to pull information from a specific record in either a table or query. In most cases only the first record of the dataset is read to get the information required. If the dataset is EOF, the information was not found.
Since I'm making changes anyway I want to code these type of routines in the most efficient way.
In these routines, I noticed some cases the developer used
set rs = db.Openrecordset (selectstring, dbOpenSnapshot, dbReadonly)
and in others the developer uses
set rs = db.Openrecordset (selectstring, dbOpenForwardOnly, dbReadonly)
My question is: In this scenario and type of usage which of these options (dbOpenSnapshot or dbOpenForwardOnly) is the most efficient, or is there any real difference?
Here's an example of this type of routine.
NOTE: In the example below I realize that MoveLast and MoveFirst would need to be removed if dbForwardOnly is used but that is easily done and the recordcount will always return 1. I think those statements are remnants of the original ADO recordset handling.
Public Sub getInstallPlanInfoFromPropertyID(passedPropertyID As Long, _
returnPAY_AGREE_TYPE As String, _
returnPAY_AGREE_START_DATE As Date, _
returnPAY_AGREE_END_DATE As Date, _
returnPAYMENT_AGREEMENT_TYPE As String)
returnPAY_AGREE_TYPE = cNoRecFound
returnPAYMENT_AGREEMENT_TYPE = cNoRecFound
Dim wkPaidToDate As Double
selectString = "Select [PAY_AGREE_TYPE], [PAY_AGREE_START_DATE], [PAY_AGREE_END_DATE], [PAYMENT_AGREEMENT_TYPE] " & _
" From qryInstallPay_Main_ForCOPDW " & _
" Where ([PropertyID] = " & passedPropertyID & " ) "
Set db = getCurrentDbC
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset(selectString, dbOpenSnapshot, dbReadOnly)
If rs.EOF Then
If rs.RecordCount > 0 Then
returnPAY_AGREE_TYPE = Nz(rs!PAY_AGREE_TYPE, 0)
'////old logic below, revised 09/27/16
'returnPAY_AGREE_START_DATE = Nz(rs!PAY_AGREE_START_DATE, 0)
'returnPAY_AGREE_END_DATE = Nz(rs!PAY_AGREE_END_DATE, 0)
' new logic 09/27/16
returnPAY_AGREE_START_DATE = Nz(rs!PAY_AGREE_START_DATE, cNoDateFound) ' return cNoDateFound if Null 09/27/16
returnPAY_AGREE_END_DATE = Nz(rs!PAY_AGREE_END_DATE, cNoDateFound) ' return cNoDateFound if Null 09/27/16
returnPAYMENT_AGREEMENT_TYPE = Nz(rs!PAYMENT_AGREEMENT_TYPE, 0)
Set rs = Nothing