У меня есть очень большой поисковый скрипт, который до сих пор не был параметризован (хотя частично защищен функцией регулярного выражения и не был открыт для общего доступа), но, только что преобразовав его, я столкнулся с некоторыми проблемами сспособ, которым я использовал, чтобы получить количество записей.
Это пример моего сценария до параметризации:
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
, который затем можно использовать для запроса подсчета, но мои предположения не всегда являются лучшим методом.
Любая помощь всегда очень ценится.