The GetRows method of the ADO object is known to be the fastest way to fetch a recordset. In this article, I will show you a VBScript class that you can use against any database. You call a public function with your SELECT query as the argument, and it returns your resultset in the form of an array.
VBScript Class
Below is the complete code for the VBScript class Database. Notice that in the Sub Class_Initialize I am using a trick where it tries up to 10 times to get a connection to the database. For a busy site with a not such powerful database (like MS Access), this can be a life saver.
To make this work for you, you need to edit the class code to point to your database. The i_dbConnection points to my access database. Change it appropriately.
Class Database
Dim i_dbConnection
Dim i_objConn
Dim i_objRS
Private Sub Class_Initialize()
Const MAX_TRIES = 10
Dim intTries
On Error Resume Next
Do
Err.Clear
'edit the next line to point to your database
i_dbConnection = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("/faqs.mdb")
Set i_objConn = Server.CreateObject("ADODB.Connection")
i_objConn.Open i_dbConnection
Set i_objRS = Server.CreateObject("ADODB.Recordset")
intTries = intTries + 1
Loop While (Err.Number <> 0) And (intTries < MAX_TRIES)
End Sub
Public Function GetArray(strQuery)
'-- Cursor Type, Lock Type
' ForwardOnly 0 - ReadOnly 1
' KeySet 1 - Pessimistic 2
' Dynamic 2 - Optimistic 3
' Static 3 - BatchOptimistic 4
i_objRS.Open strQuery, i_objConn, 0, 1
If Err.Number <> 0 Then
Response.Write("There was an error processing your request.<br>Please try again.")
Exit Function
Else
If i_objRS.EOF and i_objRS.BOF Then
Response.Write("There are currently no records returned.")
Exit Function
Else
GetArray = i_objRS.GetRows()
End If
End If
End Function
Private Sub Class_Terminate()
Const adOpenState = 1 'indicates that the object is open
If Not i_objRS Is Nothing Then
If i_objRS.State = adOpenState Then
i_objRS.Close
End If
Set i_objRS = Nothing
End If
If Not i_objConn Is Nothing Then
If i_objConn.State = adOpenState Then
i_objConn.Close
End If
Set i_objConn = Nothing
End If
End Sub
End Class
The code above shows a typical scenario of using a SELECT statement. Let’s say you pass an ID to a page through the URL (“page.asp?ID=3″). You want to capture this ID, add it to your query which is then executed. All that can be seen above. You create an instance of the class, and call the public function GetArray which needs the query as an argument. A local variable arrAllData is used to store the returning results as an array. Then you can simply loop through this variable and write out the results.
Looping through your results
There are 2 ways to loop through your results. One way can be an automatic loop.
Dim numCols 'number of fields per row in results
Dim numColCounter 'used to loop through the columns
Dim numRows 'number of rows in results
Dim numRowCounter 'used to loop through the rows
Dim strthisfield 'current field in loop
numCols = UBound(arrAllData, 1)
numRows = UBound(arrAllData, 2)
Response.Write("<table border=""1"">" & vbcrlf)
'loop through rows
For numRowCounter = 0 To numRows
Response.Write("<tr>" & vbcrlf)
'for each column
For numColCounter = 0 to numCols
strthisfield = arrAllData(numColCounter, numRowCounter)
If IsNull(strthisfield) Then
strthisfield = "-null-"
End If
If Trim(strthisfield) = "" Then
strthisfield = " "
End If
Response.Write("<td valign=top>" & strthisfield & "</td>" & vbcrlf)
Next
Response.Write("</tr>" & vbcrlf)
Next
Response.Write("</table>")
By looping as shown above you don’t have to worry about how many fields you are selecting. You can change your SELECT statement and everything will still function as expected. You can even do a SELECT * and it will still work.
A second way of looping through your local array is to assign individual values in the array to local variables. This way you have more control over your variables and how to use them.
'declare local variables for fields in array Dim strQuestion Dim strAnswer Dim datCreated Dim strPoster Dim i For i = 0 To UBound(arrAllData, 2) strQuestion = arrAllData(0, i) strAnswer = arrAllData(1, i) datCreated = arrAllData(2, i) strPoster = arrAllData(3, i) 'do something with these variables 'like a Response.Write Next
Either way works fine. Use the one that works best for you. One could easily modify this class to meet their needs. For example, you could expand the number of arguments in the GetArray Function to match the standard arguments of the GetRows method:
GetRows (Rows, Start, Fields)