Классический ASP - преобразование скрипта для использования параметров, вызывающих проблемы - PullRequest
0 голосов
/ 18 января 2012

У меня есть очень большой поисковый скрипт, который до сих пор не был параметризован (хотя частично защищен функцией регулярного выражения и не был открыт для общего доступа), но, только что преобразовав его, я столкнулся с некоторыми проблемами сспособ, которым я использовал, чтобы получить количество записей.

Это пример моего сценария до параметризации:

selectClause = "SELECT column FROM table "
whereClause = "WHERE something = 'something' "

If something = "someCondition" Then
whereClause = whereClause & "AND something = '"&input&"' "
End If

If somethingElse = "someOtherCondition" Then
whereClause = whereClause & "AND somethingElse = '"&input&"' "
End If

' ... plus loads more conditional statements...

orderClause = "ORDER BY something DESC "

' get the total number of records, which is now what I am stuck on ////

SQL = " SELECT COUNT(*) AS total FROM ("&selectClause & whereClause&") AS Q1; "
Set rs = Conn.Execute(SQL)
If NOT rs.EOF Then
Session("record-count") = rs.Fields("totalRecords")
End If
rs.Close

' calculate paging and limitClause

... some code
limitClause = limit 0, 20 ' example

' build query

SQL = selectClause & whereClause & orderClause & limitClause

Conn.Execute(SQL)

Кроме того, что он был открыт для атаки, он работал нормально.Поэтому я начал преобразовывать его, используя параметры, но теперь я не могу понять, как получить общее количество без необходимости повторной записи всего поискового запроса, что в 30 раз превышает длину моего примера (см. Выше).Надеюсь, мой код ниже объяснит мою ситуацию лучше.

selectClause = "SELECT column FROM table "
whereClause = "WHERE something = 'something' "

If something = "someCondition" Then
whereClause = whereClause & "AND something = ? "
Set newParameter = cmdConn.CreateParameter("@blah1", ad_varChar, ad_ParamInput, Len(input), Replace(input,"'","\'"))
cmdConn.Parameters.Append newParameter
End If

If somethingElse = "someOtherCondition" Then
whereClause = whereClause & "AND somethingElse = ? "
Set newParameter = cmdConn.CreateParameter("@blah2", ad_varChar, ad_ParamInput, Len(input), Replace(input,"'","\'"))
cmdConn.Parameters.Append newParameter
End If

orderClause = "ORDER BY something DESC "

' but now the whereClause contains ?'s which cannot be used here, which has confused me on how I should be getting the new count.
' /////////////////////////////
SQL = " SELECT COUNT(*) AS total FROM ("&selectClause & whereClause&") AS Q1; "
Set rs = Conn.Execute(SQL)
If NOT rs.EOF Then
Session("record-count") = rs.Fields("totalRecords")
End If
rs.Close
' /////////////////////////////

' calculate paging and limitClause

... some code
limitClause = "limit x, y;"

' build query

SQL = selectClause & whereClause & orderClause & limitClause

cmdConn.CommandText = SQL

Как вы можете видеть, я не могу использовать метод подсчета, который использовал раньше, потому что в предложении where содержится?, Что означает, что конкретный запрос count нуждается в своем собственномколлекция параметров.Кто-нибудь может подсказать, как теперь я могу получить свой счет без дублирования этого огромного запроса?

Возможно, я бы, вероятно, создал бы другой объект команды cmdConn2, и там, где я установил параметр, установите другойто же самое, что и cmdConn2, который затем можно использовать для запроса подсчета, но мои предположения не всегда являются лучшим методом.

Любая помощь всегда очень ценится.

1 Ответ

0 голосов
/ 18 января 2012

Таким образом, по сути все, кроме предложений select и order by, будет идентичным для обоих запросов.

Поэтому один ответ будет:

  • Переместить все, кроме предложений select и order by в подпрограмму.
  • Задайте для условия select значение select column from table, вызовите подпрограмму для общей обработки, затем соответствующим образом установите предложение order by и выполните SQL.
  • Затем задайте для условия select значение select count(*) from table, вызовите подпрограмму для общей обработки, а затем выполните SQL (нет предложения order by).

В качестве альтернативы, вы можете использовать что-нибудь вроде ADO RecordSet RecordCount свойство из результата первого запроса, чтобы получить количество возвращаемых записей?

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