Hi,
I am having a problem using Dreamweaver CS3 standard recordset paging behavior. It doesn’t seem to work when I pass parameter values from a FORM on my search page, to the recordset on my results page.
- Recordset Paging works if no parameters are used in the recordset sql code (ie. simple sql code):
SELECT *
FROM db_name
WHERE (db_field1 LIKE ‘%text1%’ OR db_field2 LIKE ‘%text2%’)
- Recordset Paging works if I pass the same text to the sql code using parameters set within the recordset:
SELECT *
FROM db_name
WHERE (db_field1 LIKE %parameter1% OR db_field2 LIKE %parameter2%)
--> inside the recordset parameter1 was set to ‘text1’, parameter2 was set to ‘text2
- However if I pass the same text (text1, text2) from a FORM on a search page to the recordset using recordset parameters, the Recordset Paging fails.
SELECT *
FROM db_name
WHERE (db_field1 LIKE %parameter1% OR db_field2 LIKE %parameter2%)
--> inside the recordset parameter1 and parameter2 were set using the Request.Form("….")
--> on the FORM the values of the fields were set to text1, text2
The form, database, sql code all work fine. After I perform a search, the correct database results are displayed on my first results.asp page. My problem is when I try to use recordset paging. For some reason when I try to page through the results I get the following error:
Error Type:
ADODB.Field (0x800A0BCD)
Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
I have completely striped my code to the bare essentials, and conclude that the search criteria are not being sent to the results page each time I click “Next” etc. Therefore each time I try to page through the results, the recordset values are all empty and the EOF value is returned.
Please have a quick look at the code below. Any help, advice, suggestions or other scripts (javascript or vbscript) that will work instead will be gratefully accepted. I have been trying to fix this for days and it’s driving me crazy.
To help you understand the code here is a brief explanation of its purpose, a list of the variables used and the error produced.
- takes 2 search fields from FORM on search page (SearchValue1 = city, SearchValue2 = country)
- compares with database field (Keywords) for any matches (database name = test20.mdb)
- outputs the text contents of database field (Image_Name)
- the text outputs are displayed one per page eg. page 1 = record 1, page2 = record 2, page 3 = record 3 ....
- a "Next" link pages through the displayed results
File Name = results.asp
Connection File Name = con_cwphoto.asp
Recordset Name = rs
Database name = test20.mdb
Database Field Names = Keywords, Image_Name
FORM Fields (on search.asp page) = SearchValue1 (city), SearchValue2 (country)
The URL passed by clicking the “Next” link:
It seems to pass the search criteria, but maybe it isn’t being passed correctly.
The error:
Error Type:
ADODB.Field (0x800A0BCD)
Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
The line the error points to:
<p><%=(rs.Fields.Item("Image_Name").Value)%></p>
This line is in the html tags and displays the contents of the “Image_Name” database field.
The CS3 recordset paging behavior code:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!--#include file="../Connections/con_cwphoto.asp" -->
<%
‘ Get search criteria from FORM on the search page
‘ (FORM has 2 fields - SearchValue1 and SearchValue2)
Dim rs__SearchValue1
rs__SearchValue1 = "NULL"
If (Request.Form("SearchValue1") <> "") Then
rs__SearchValue1 = Request.Form("SearchValue1")
End If
%>
<%
Dim rs__SearchValue2
rs__SearchValue2 = "NULL"
If (Request.Form("SearchValue2") <> "") Then
rs__SearchValue2 = Request.Form("SearchValue2")
End If
%>
<%
' set up connection (con_cwphoto)
' SQL code compares search criteria with "Keywords" db field in "test20.mdb" db
Dim rs
Dim rs_cmd
Dim rs_numRows
Set rs_cmd = Server.CreateObject ("ADODB.Command")
rs_cmd.ActiveConnection = MM_con_cwphoto_STRING
rs_cmd.CommandText = "SELECT * FROM test20 WHERE (Keywords LIKE ? OR Keywords LIKE ?)"
rs_cmd.Prepared = true
rs_cmd.Parameters.Append rs_cmd.CreateParameter("param1", 200, 1, 255, "%" + rs__SearchValue1 + "%") ' adVarChar
rs_cmd.Parameters.Append rs_cmd.CreateParameter("param2", 200, 1, 255, "%" + rs__SearchValue2 + "%") ' adVarChar
Set rs = rs_cmd.Execute
rs_numRows = 0
%>
<%
' *** Recordset Stats, Move To Record, and Go To Record: declare stats variables
Dim rs_total
Dim rs_first
Dim rs_last
' set the record count
rs_total = rs.RecordCount
' set the number of rows displayed on this page
If (rs_numRows < 0) Then
rs_numRows = rs_total
Elseif (rs_numRows = 0) Then
rs_numRows = 1
End If
' set the first and last displayed record
rs_first = 1
rs_last = rs_first + rs_numRows - 1
' if we have the correct record count, check the other stats
If (rs_total <> -1) Then
If (rs_first > rs_total) Then
rs_first = rs_total
End If
If (rs_last > rs_total) Then
rs_last = rs_total
End If
If (rs_numRows > rs_total) Then
rs_numRows = rs_total
End If
End If
%>
<%
Dim MM_paramName
%>
<%
' *** Move To Record and Go To Record: declare variables
Dim MM_rs
Dim MM_rsCount
Dim MM_size
Dim MM_uniqueCol
Dim MM_offset
Dim MM_atTotal
Dim MM_paramIsDefined
Dim MM_param
Dim MM_index
Set MM_rs = rs
MM_rsCount = rs_total
MM_size = rs_numRows
MM_uniqueCol = ""
MM_paramName = ""
MM_offset = 0
MM_atTotal = false
MM_paramIsDefined = false
If (MM_paramName <> "") Then
MM_paramIsDefined = (Request.QueryString(MM_paramName) <> "")
End If
%>
<%
' *** Move To Record: handle 'index' or 'offset' parameter
if (Not MM_paramIsDefined And MM_rsCount <> 0) then
' use index parameter if defined, otherwise use offset parameter
MM_param = Request.QueryString("index")
If (MM_param = "") Then
MM_param = Request.QueryString("offset")
End If
If (MM_param <> "") Then
MM_offset = Int(MM_param)
End If
' if we have a record count, check if we are past the end of the recordset
If (MM_rsCount <> -1) Then
If (MM_offset >= MM_rsCount Or MM_offset = -1) Then ' past end or move last
If ((MM_rsCount Mod MM_size) > 0) Then ' last page not a full repeat region
MM_offset = MM_rsCount - (MM_rsCount Mod MM_size)
Else
MM_offset = MM_rsCount - MM_size
End If
End If
End If
' move the cursor to the selected record
MM_index = 0
While ((Not MM_rs.EOF) And (MM_index < MM_offset Or MM_offset = -1))
MM_rs.MoveNext
MM_index = MM_index + 1
Wend
If (MM_rs.EOF) Then
MM_offset = MM_index ' set MM_offset to the last possible record
End If
End If
%>
<%
' *** Move To Record: if we dont know the record count, check the display range
If (MM_rsCount = -1) Then
' walk to the end of the display range for this page
MM_index = MM_offset
While (Not MM_rs.EOF And (MM_size < 0 Or MM_index < MM_offset + MM_size))
MM_rs.MoveNext
MM_index = MM_index + 1
Wend
' if we walked off the end of the recordset, set MM_rsCount and MM_size
If (MM_rs.EOF) Then
MM_rsCount = MM_index
If (MM_size < 0 Or MM_size > MM_rsCount) Then
MM_size = MM_rsCount
End If
End If
' if we walked off the end, set the offset based on page size
If (MM_rs.EOF And Not MM_paramIsDefined) Then
If (MM_offset > MM_rsCount - MM_size Or MM_offset = -1) Then
If ((MM_rsCount Mod MM_size) > 0) Then
MM_offset = MM_rsCount - (MM_rsCount Mod MM_size)
Else
MM_offset = MM_rsCount - MM_size
End If
End If
End If
' reset the cursor to the beginning
If (MM_rs.CursorType > 0) Then
MM_rs.MoveFirst
Else
MM_rs.Requery
End If
' move the cursor to the selected record
MM_index = 0
While (Not MM_rs.EOF And MM_index < MM_offset)
MM_rs.MoveNext
MM_index = MM_index + 1
Wend
End If
%>
<%
' *** Move To Record: update recordset stats
' set the first and last displayed record
rs_first = MM_offset + 1
rs_last = MM_offset + MM_size
If (MM_rsCount <> -1) Then
If (rs_first > MM_rsCount) Then
rs_first = MM_rsCount
End If
If (rs_last > MM_rsCount) Then
rs_last = MM_rsCount
End If
End If
' set the boolean used by hide region to check if we are on the last record
MM_atTotal = (MM_rsCount <> -1 And MM_offset + MM_size >= MM_rsCount)
%>
<%
' *** Go To Record and Move To Record: create strings for maintaining URL and Form parameters
Dim MM_keepNone
Dim MM_keepURL
Dim MM_keepForm
Dim MM_keepBoth
Dim MM_removeList
Dim MM_item
Dim MM_nextItem
' create the list of parameters which should not be maintained
MM_removeList = "&index="
If (MM_paramName <> "") Then
MM_removeList = MM_removeList & "&" & MM_paramName & "="
End If
MM_keepURL=""
MM_keepForm=""
MM_keepBoth=""
MM_keepNone=""
' add the URL parameters to the MM_keepURL string
For Each MM_item In Request.QueryString
MM_nextItem = "&" & MM_item & "="
If (InStr(1,MM_removeList,MM_nextItem,1) = 0) Then
MM_keepURL = MM_keepURL & MM_nextItem & Server.URLencode(Request.QueryString(MM_item))
End If
Next
' add the Form variables to the MM_keepForm string
For Each MM_item In Request.Form
MM_nextItem = "&" & MM_item & "="
If (InStr(1,MM_removeList,MM_nextItem,1) = 0) Then
MM_keepForm = MM_keepForm & MM_nextItem & Server.URLencode(Request.Form(MM_item))
End If
Next
' create the Form + URL string and remove the intial '&' from each of the strings
MM_keepBoth = MM_keepURL & MM_keepForm
If (MM_keepBoth <> "") Then
MM_keepBoth = Right(MM_keepBoth, Len(MM_keepBoth) - 1)
End If
If (MM_keepURL <> "") Then
MM_keepURL = Right(MM_keepURL, Len(MM_keepURL) - 1)
End If
If (MM_keepForm <> "") Then
MM_keepForm = Right(MM_keepForm, Len(MM_keepForm) - 1)
End If
' a utility function used for adding additional parameters to these strings
Function MM_joinChar(firstItem)
If (firstItem <> "") Then
MM_joinChar = "&"
Else
MM_joinChar = ""
End If
End Function
%>
<%
' *** Move To Record: set the strings for the first, last, next, and previous links
Dim MM_keepMove
Dim MM_moveParam
Dim MM_moveFirst
Dim MM_moveLast
Dim MM_moveNext
Dim MM_movePrev
Dim MM_urlStr
Dim MM_paramList
Dim MM_paramIndex
Dim MM_nextParam
MM_keepMove = MM_keepBoth
MM_moveParam = "index"
' if the page has a repeated region, remove 'offset' from the maintained parameters
If (MM_size > 1) Then
MM_moveParam = "offset"
If (MM_keepMove <> "") Then
MM_paramList = Split(MM_keepMove, "&")
MM_keepMove = ""
For MM_paramIndex = 0 To UBound(MM_paramList)
MM_nextParam = Left(MM_paramList(MM_paramIndex), InStr(MM_paramList(MM_paramIndex),"=") - 1)
If (StrComp(MM_nextParam,MM_moveParam,1) <> 0) Then
MM_keepMove = MM_keepMove & "&" & MM_paramList(MM_paramIndex)
End If
Next
If (MM_keepMove <> "") Then
MM_keepMove = Right(MM_keepMove, Len(MM_keepMove) - 1)
End If
End If
End If
' set the strings for the move to links
If (MM_keepMove <> "") Then
MM_keepMove = Server.HTMLEncode(MM_keepMove) & "&"
End If
MM_urlStr = Request.ServerVariables("URL") & "?" & MM_keepMove & MM_moveParam & "="
MM_moveFirst = MM_urlStr & "0"
MM_moveLast = MM_urlStr & "-1"
MM_moveNext = MM_urlStr & CStr(MM_offset + MM_size)
If (MM_offset - MM_size < 0) Then
MM_movePrev = MM_urlStr & "0"
Else
MM_movePrev = MM_urlStr & CStr(MM_offset - MM_size)
End If
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<p> </p>
<%
' html code: displays the text from "Image_Name" db field on the results.asp page
' "Next" link pages through the results (1 by 1)
' each time it passes a string with the search criteria and the index or offset numbers
%>
<p><%=(rs.Fields.Item("Image_Name").Value)%></p>
<p> </p>
<p> <a href="<%=MM_moveNext%>">Next</a></p>
<p> </p>
<p> </p>
<p> </p>
</body>
</html>
<%
rs.Close()
Set rs = Nothing
%>