How to use GetRows ADO RecordSet method in ASP
RecordSet.GetRows method, the best way to retrieve data with ADO! GetRows, does
this sound familiar? If not, then it’s time to learn how to retrieve/manipulate
your data more efficiently with ADO.
The ultimate goal of the software development is to produce efficient, easy to
maintain and highly scalable applications. An application can be called
scalable if it has the ability to serve a large number of concurrent users
without incurring a performance penalty.
One of the most common tasks in programming is the data retrieval and
manipulation and as far as my experience goes almost any software project I
have worked on has involved databases. Having said that, lets continue with our
main subject GetRows method of the ADO RecordSet object. I presume that you are
familiar to some degree with ADO and the RecordSet object and you have basic
programming skills.
In most cases, when you need to retrieve & display some data from a database
you will use code similar to the one listed below:
<%
Set oConnection = Server.CreateObject("ADODB.Connection")
oConnection.Open(sConnectionString)
sSQL = "SELECT FirstName, LastName, Phone FROM tblCustomers"
Set oRecordSet = oConnection.Execute(sSQL)
While Not oRecordSet.EOF
Response.Write(oRecordSet("LastName") & ", " & oRecordSet("FirstName") & " - "
& oRecordSet("Phone") & "
")
oRecordSet.MoveNext
Wend
Set oRecordSet = Nothing
oConnection.Close
Set oConnection = Nothing
%>
In short, you connect to the database, execute a SQL statement and get the
result set into your RecordSet object. And what do you do then; you start
looping through the RecordSet and display the result records one at a time. So
what is wrong with looping through a RecordSet? The only problem with this
approach is that is very inefficient and resource consuming. Is our little
application above scalable? The answer is NO! Lets have a detailed look at our
loop:
<%
While Not oRecordSet.EOF
Response.Write(oRecordSet("LastName") & ", " & oRecordSet("FirstName") & " - "
& oRecordSet("Phone") & "
")
oRecordSet.MoveNext
Wend
%>
After we have displayed a record using Response.Write, we move to the next one
with the MoveNext RecordSet method, until we reach the last record. Every time
we access one of the records in our RecordSet we send a read request to the
database server. What I’ve just said is not exactly correct, because the
RecordSet object caches the retrieved data - when you request record #1 it will
actually extract the first 100 records and it won’t connect to the database
until your application request record # between 100 and 200. If we deal with
huge sets of data, for example 10000 rows with 5 columns each, the retrieval
time will be unacceptably high. Don’t forget that each .MoveNext and .EOF add
an additional request to the database. Now we know that looping through a
RecordSet is expensive in terms of server resources, so how do we improve the
performance of our little application? The answer is GetRows. The GetRows
method of the RecordSet object will extract the entire result set with only one
call to the database and will assign the data to a 2 dimensional array:
<%
arrResultSet = oRecordSet.GetRows()
%>
You can limit the # of rows that you retrieve with GetRows by passing a number
to the GetRows method. The example below will get only the first 1000 rows and
assign them to the arrResultSet array:
<%
arrResultSet = oRecordSet.GetRows(1000)
%>
You can check the modified ASP script using the GetRows method below:
<%
Set oConnection = Server.CreateObject("ADODB.Connection")
oConnection.Open(sConnectionString)
sSQL = "SELECT FirstName, LastName, Phone FROM tblCustomers"
Set oRecordSet = oConnection.Execute(sSQL)
If Not oRecordSet.EOF
' Gets all the records
arrResultSet = oRecordSet.GetRows()
End If
'Close the connection with the database and free all database resources
Set oRecordSet = Nothing
oConnection.Close
Set oConnection = Nothing
' Retrieve the total # of rows
iRowNumber = ubound(arrResultSet,2)
' Loop through the array holding the result set and display the data
For iCounter= 0 to iRowNumber
Response.Write(arrResultSet(1,iCounter) & ", " & arrResultSet(2,iCounter) & " -
" & arrResultSet(0,iCounter) & "
")
Next
%>
|