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
			'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
			If i_objRS.EOF and i_objRS.BOF Then
				Response.Write("There are currently no records returned.")
				Exit Function
				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
			End If
			Set i_objRS = Nothing
		End If
		If Not i_objConn Is Nothing Then
			If i_objConn.State = adOpenState Then
			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)
	Response.Write("</tr>" & vbcrlf)


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

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)