我有一个非常大的搜索脚本,直到现在还没有参数化(尽管受到正则表达式函数的半保护,并且不是公开的),但是在刚刚转换它之后,我遇到了一些关于我用来获取记录数量的方法的问题。
这是我的脚本的一个例子,在被参数化之前:
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正如你所看到的,我不能使用我以前使用的count方法,因为where子句包含?,这意味着特定的count查询需要它自己的参数集合。
根据猜测,我可能会创建另一个命令对象cmdConn2,并在其中设置一个参数,设置另一个与cmdConn2相同的参数,然后将其用于count查询,但我的猜测并不总是最好的方法。
任何帮助都是非常感谢的。
发布于 2012-01-18 18:25:47
因此,对于这两个查询,除了select和order by子句之外,基本上所有内容都是相同的。
因此,一个答案是:
select和order by子句之外的所有内容移动到要执行select column from table的order by子句中,调用用于公共处理的子例程,然后适当设置order by子句并执行SQL。或者,是否可以使用第一个查询结果中的ADO RecordSet RecordCount property来获取返回的记录数?
https://stackoverflow.com/questions/8905445
复制相似问题