当前位置: 首页 > 图文教程 > 网络编程 > ASP > 使用Filter实现信息的二次检索

ASP
Adodb.Command 平时很少注意到的一个参数
Asp.Net控件加载错误的解决方法
远程连接access数据库的方法
创建具有JScript的HTML的XMLHTTP
在Asp中如何快速优化分页的技巧
用VB生成DLL封装ASP代码,连接数据库
RS.OPEN SQL,CONN,A,B 全接触
利用adodb.stream直接下载任何后缀的文件(防盗链)
用ASP编程控制在IIS建立Web站点的程序代码
使用VBScript操作Html复选框(CheckBox)控件
把文章内容中涉及到的图片自动保存到本地服务器
两个不同数据库表的分页显示解决方案
使用组件封装数据库操作(一)
使用组件封装数据库操作(二)
如何在pb中创建COM组件,并在asp中调用并返回结果集?
用ASP和Microsoft.XMLDOM分析远程XML文件
浅谈无刷新取得远程数据技术
将ASP纪录集输出成n列的的表格形式显示的方法
在ASP中通过oo4o连接Oracle数据库的例子
Server Application Error详细解决办法

ASP 中的 使用Filter实现信息的二次检索


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 252 ::
收藏到网摘: n/a

思考一个问题:怎么实现在第一次检索的基础上进行二次检索?

通常,我们的做法是第一次检索时保存检索条件,在第二次行检索时组合两次检索条件对数据库进行一次新的查询,如:

第一次检索:Select * from table where age>18

第二次检索:Select * from table where age>18 and name like 'zh%'

这样做虽可以实现我们所要的结果,但效率上个人认为却大打了折扣!

能不能缓存第一次检索的记录集,第二次检索时只在缓存的记录集上进行,而不是重新对数据库进行查询?

RecordSet对象有个属性Filter,它的作用是通过添加条件以控制欲显示的记录集,但并不影响原本的记录集!我们来看下怎么用它实现二次检索:

以下为引用的内容:
<%
Dim oConn,oRs
Set oConn=Server.CreateObject("ADODB.Connection")
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db1.mdb")
Set ors = Server.CreateObject("ADODB.RecordSet")
ors.Open "select * from t1 where age>20",oConn,1,2

Response.Write "一次检索:select * from t1 where age>20<br/>"
Response.Write "----------------------------------<br/><br/>"
Do while not ors.Eof
    Response.Write ors("name") & ":" & ors("age") & "<br/>"
    ors.MoveNext
Loop
Response.Write "总计:" & ors.RecordCount & "<br/>"
Response.Write "----------------------------------<br/><br/>"


Response.Write "二次检索:Filter(name like '王%')<br/>"
Response.Write "----------------------------------<br/><br/>"
ors.Filter = "name like '王%'"
If not(oRs.Eof and ors.Bof) Then ors.MoveFirst
Do while not ors.Eof
    Response.Write ors("name") & ":" & ors("age") & "<br/>"
    ors.MoveNext
Loop
Response.Write "总计:" & ors.RecordCount & "<br/>"
Response.Write "----------------------------------<br/>"

ors.Close
Set ors = Nothing
oConn.Close
Set oConn = Nothing
%>

结果:

但这还有一个问题:很多情况下两次检索并不是同时进行的,而是在第一次检索完成后手动输入条件再进行二次检索,所以我们得想办法在二次检索时第一次检索的记录集仍存在!我们可以用Session对象!将Connection对象和RecordSet对象都保存在Session中,实现如下:

以下为引用的内容:
List.asp:
<%
Set Session("conn")=Server.CreateObject("ADODB.Connection")
Session("conn").Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db1.mdb")
Set Session("rs") = Server.CreateObject("ADODB.RecordSet")
Session("rs").Open "select * from t1 where age>20",Session("conn"),1,2

Response.Write "一次检索:select * from t1 where age>20<br/>"
Response.Write "----------------------------------<br/><br/>"
Do while not Session("rs").Eof
    Response.Write Session("rs")("name") & ":" & Session("rs")("age") & "<br/>"
    Session("rs").MoveNext
Loop
Response.Write "总计:" & Session("rs").RecordCount & "<br/>"
Response.Write "----------------------------------<br/><br/>"
%>
<form action="search.asp" method="post" name="form1" target="_blank">
  二次检索:
    <input name="f" type="text" id="f">
  <input type="submit" name="Submit" value="提交">
</form>

Search.asp:
<%
Response.Write "二次检索条件:" & Trim(Request("f")) & "<br/>"
Response.Write "----------------------------------<br/><br/>"

Session("rs").Filter = ""
Session("rs").Filter = Trim(Request("f"))
If not(Session("rs").Eof and Session("rs").Bof) Then Session("rs").MoveFirst
do while not Session("rs").Eof
    Response.Write Session("rs")("id") & ":" & Session("rs")("name") & "<br/>"
    Session("rs").MoveNext
loop
Response.Write "总计:" & Session("rs").RecordCount & "<br/>"
Response.Write "----------------------------------<br/>"
%>

 结果:

参考文章:

1.ado多次按条件使用一个记录集中的数据的方法:http://blog.csdn.net/precipitant/archive/2005/08/04/446003.aspx

2.ado 记录集对象的filter属性使用中需注意的地方:http://blog.csdn.net/precipitant/archive/2005/12/13/550979.aspx

原文:http://www.mzwu.com/article.asp?id=1106