ASP Поиск и результаты на одной странице - PullRequest
0 голосов
/ 22 сентября 2009

У меня есть одна классическая ASP-страница, на которой я хочу отобразить форму поиска и связанные с ней результаты.

Когда пользователь впервые заходит на эту страницу, я хочу отобразить форму поиска и 10 последних свойств. Если пользователь решает использовать форму поиска для получения более релевантных свойств, то я хочу, чтобы 10 последних свойств по умолчанию были заменены поисковыми результатами пользователей.

Пока мой код выглядит так:

<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>

Но когда я просматриваю страницу, я получаю следующую ошибку:

ADODB.Recordset error '800a0e78'

Operation is not allowed when the object is closed.

/welcome/gist188770.asp, line 98 

Строка 98 выглядит следующим образом;

if myRecordSet2.BOF then

Я задавался вопросом, сможет ли кто-нибудь помочь мне решить эту проблему? Спасибо за любую помощь.

Нил.

1 Ответ

2 голосов
/ 22 сентября 2009

Вы не открыли набор записей в точке, в которой вы используете BOF.

Кроме того, вы создаете объект команды, но не присваиваете ему текст SQL, а присваиваете текст sql непосредственно для набора записей.

Вы можете присвоить SQL свойству CommandText объекта команды, а затем извлечь набор записей, вызвав объект Command * Execute метод.

Редактировать :

Другие вещи, требующие исправления

Ваша конкатенация SQL не содержит ни vbCrLf, ни пробелов в конце каждой строки. SQL не будет выполнен.

Не присваивайте строку подключения непосредственно ActiveConnection, хотя это работает, ADODB не управляет пулом соединений правильно, делая это таким образом. Всегда создавайте экземпляр объекта Connection и присваивайте его свойству ActiveConnection.

Редактировать 2 :

Еще одна проблема

Ваш код обращается к критериям из Request.QueryString, но ваш элемент form указывает method="post", и в этом случае вы должны использовать Request.Form.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...