2009-09-22 5 views
0

J'ai une seule page ASP classique que je souhaite afficher un formulaire de recherche et les résultats associés. Lorsqu'un utilisateur vient à cette page pour la première fois, je souhaite afficher un formulaire de recherche et les 10 dernières propriétés. Si un utilisateur décide d'utiliser le formulaire de recherche pour récupérer des propriétés plus pertinentes, je souhaite que les 10 dernières propriétés par défaut soient remplacées par les résultats de recherche paginée des utilisateurs.Recherche ASP et résultats dans une seule page

Jusqu'ici mon code ressemble à ceci;

<head> 
    <title>Search</title> 
</head> 
<body> 

<div class="search"> 
<h3>Search form</h3> 
<form id="form1" name="form1" method="post" action="gist188770.asp"> 
<label>Street: <input type="text" name="searchStreet" value="<%=Server.HtmlEncode(Request("searchStreet") & "") %>" /></label> 
<label>Town: <input type="text" name="searchTown" value="<%=Server.HtmlEncode(Request("searchTown") & "") %>" /></label> 
<input type="submit" name="Submit" value="Submit" /> 
</form> 
</div> 

<% 

if (Request.ServerVariables("REQUEST_METHOD") = "POST") then 

'arrived via post get form values and do search 
Dim myRecordSet 
Dim myRecordSet_numRows 

Set myRecordSet = Server.CreateObject("ADODB.Recordset") 
myRecordSet.ActiveConnection = MM_dbconn_STRING 

'collect the form input 
set objDBParam = objDBCommand.CreateParameter("@ContentStreet",200,1,100) 
    objDBCommand.Parameters.Append objDBParam 
    objDBCommand.Parameters("@ContentStreet") = Request.QueryString("searchStreet") 
set objDBParam = Nothing 
set objDBParam = objDBCommand.CreateParameter("@ContentStreet",200,1,100) 
    objDBCommand.Parameters.Append objDBParam 
    objDBCommand.Parameters("@ContentTown") = Request.QueryString("searchTown") 
set objDBParam = Nothing 
set objDBParam = objDBCommand.CreateParameter("@ContentStreet",200,1,20) 
    objDBCommand.Parameters.Append objDBParam 
    objDBCommand.Parameters("@ContentPostcode") = Request.QueryString("searchPostcode") 
set objDBParam = Nothing 

'check for a match 
myRecordSet.Source = "SELECT *" 
myRecordSet.Source = myRecordSet.Source& "FROM (" 
myRecordSet.Source = myRecordSet.Source& "SELECT id" 
myRecordSet.Source = myRecordSet.Source& "FROM (" 
myRecordSet.Source = myRecordSet.Source& "SELECT id" 
myRecordSet.Source = myRecordSet.Source& "FROM VWTenantPropertiesResults" 
myRecordSet.Source = myRecordSet.Source& "WHERE ContentStreet LIKE '%" & "@ContentStreet" & "%'" 
myRecordSet.Source = myRecordSet.Source& "UNION ALL" 
myRecordSet.Source = myRecordSet.Source& "SELECT id" 
myRecordSet.Source = myRecordSet.Source& "FROM VWTenantPropertiesResults" 
myRecordSet.Source = myRecordSet.Source& "WHERE ContentTown LIKE '%" & "@ContentTown" & "%'" 
myRecordSet.Source = myRecordSet.Source& "UNION ALL" 
myRecordSet.Source = myRecordSet.Source& "SELECT id" 
myRecordSet.Source = myRecordSet.Source& "FROM VWTenantPropertiesResults" 
myRecordSet.Source = myRecordSet.Source& "WHERE ContentPostCode LIKE '%" & "@ContentPostcode" & "%'" 
myRecordSet.Source = myRecordSet.Source& ") qi" 
myRecordSet.Source = myRecordSet.Source& "GROUP BY" 
myRecordSet.Source = myRecordSet.Source& "id" 
myRecordSet.Source = myRecordSet.Source& "HAVING COUNT(*) >= 2" 
myRecordSet.Source = myRecordSet.Source& ") q" 
myRecordSet.Source = myRecordSet.Source& "JOIN VWTenantPropertiesResults r" 
myRecordSet.Source = myRecordSet.Source& "ON r.id = q.id" 
myRecordSet.Source = myRecordSet.Source& "WHERE ContentBedrooms BETWEEN 1 AND 4" 
myRecordSet.Source = myRecordSet.Source& "AND ContentPrice BETWEEN 50 AND 500" 
myRecordSet.Source = myRecordSet.Source& "ORDER BY" 
myRecordSet.Source = myRecordSet.Source& "ContentPrice" 

'display the results 
if myRecordSet.BOF then 
response.write("Latest properties:<br>") 
do until myRecordSet.EOF 
%> 
<div class='result'>") 
    <dl><%=myRecordSet("ContentTitle")%></dl> 
    <dt><%=myRecordSet("ContentStreet")%></dt> 
    <dt><%=myRecordSet("ContentTown")%></dt> 
    <dt><%=myRecordSet("ContentPostcode")%></dt> 
</div><% 
myRecordSet.MoveNext 
loop 
end if 

else 
    'arrived via get show last 10 results 
    Dim myRecordSet2 
    Dim myRecordSet2_numRows 

    Set myRecordSet2 = Server.CreateObject("ADODB.Recordset") 
    myRecordSet2.ActiveConnection = MM_dbconn_STRING 
    myRecordSet2.Source = "SELECT TOP 10 FROM VWTenantPropertiesResults ORDER BY ContentPrice" 

    'display the results 
    if myRecordSet2.BOF then 
    do until myRecordSet2.EOF 
    %> 
    <div class='result'>") 
     <dl><%=myRecordSet2("ContentTitle")%></dl> 
     <dt><%=myRecordSet2("ContentStreet")%></dt> 
     <dt><%=myRecordSet2("ContentTown")%></dt> 
     <dt><%=myRecordSet2("ContentPostcode")%></dt> 
    </div><% 
    myRecordSet2.MoveNext 
    loop 
end if 

end if 
%> 

</body> 
</html> 

Mais lorsque je vois la page, j'obtiens l'erreur suivante;

ADODB.Recordset error '800a0e78' 

Operation is not allowed when the object is closed. 

/welcome/gist188770.asp, line 98 

La ligne 98 est la suivante;

if myRecordSet2.BOF then 

Je me demandais si quelqu'un pourrait m'aider à résoudre ce problème? Merci pour toute aide offerte.

Neil.

+0

Veuillez publier un code pertinent dans votre question plutôt que de créer un lien vers une ressource externe. – AnthonyWJones

Répondre

2

Vous n'avez pas ouvert le jeu d'enregistrements au point d'utilisation BOF.

En outre, vous créez un objet de commande mais vous ne lui attribuez pas le texte SQL mais vous affectez directement le texte sql au jeu d'enregistrements.

Vous pouvez affecter le code SQL à la propriété CommandText de l'objet de commande, puis extraire un jeu d'enregistrements en appelant la méthode Objets de commande Execute.

Modifier:

Plus de choses qui doit fixer

Votre SQL ne concaténation comprend pas vbCrLf ou des espaces à la fin de chaque ligne. Le SQL ne s'exécutera pas.

N'attribuez pas de chaîne de connexion directement à ActiveConnection. Tant que cela fonctionne, ADODB ne gère pas correctement le regroupement de connexions. Installez toujours un objet Connection et affectez-le à la propriété ActiveConnection.

Edit 2:

Encore une autre question

Votre code accède aux critères de l'Request.QueryString encore votre élément form spécifie method="post" dans ce cas, vous devriez utiliser Request.Form à la place.

Questions connexes