首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >经典ASP -将脚本转换为使用导致问题的参数

经典ASP -将脚本转换为使用导致问题的参数
EN

Stack Overflow用户
提问于 2012-01-18 13:06:00
回答 1查看 363关注 0票数 0

我有一个非常大的搜索脚本,直到现在还没有参数化(尽管受到正则表达式函数的半保护,并且不是公开的),但是在刚刚转换它之后,我遇到了一些关于我用来获取记录数量的方法的问题。

这是我的脚本的一个例子,在被参数化之前:

代码语言:javascript
复制
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倍。希望我下面的代码能更好地解释我的情况。

代码语言:javascript
复制
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查询,但我的猜测并不总是最好的方法。

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-18 18:25:47

因此,对于这两个查询,除了selectorder by子句之外,基本上所有内容都是相同的。

因此,一个答案是:

  • 将除selectorder by子句之外的所有内容移动到要执行select column from tableorder by子句中,调用用于公共处理的子例程,然后适当设置order by子句并执行SQL。
  • 然后将<代码>D13子句设置为<代码>D14,调用用于公共处理的子例程,然后执行SQL(无<代码>D15子句)。<代码>H216<代码>F217

或者,是否可以使用第一个查询结果中的ADO RecordSet RecordCount property来获取返回的记录数?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8905445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档