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

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

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

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

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

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

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

 1<%
 2Dim oConn,oRs
 3Set oConn=Server.CreateObject("ADODB.Connection")
 4oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db1.mdb")
 5Set ors = Server.CreateObject("ADODB.RecordSet")
 6ors.Open "select * from t1 where age>20",oConn,1,2
 7
 8Response.Write "一次检索:select * from t1 where age>20<br/>"
 9Response.Write "----------------------------------<br/><br/>"
10Do while not ors.Eof
11    Response.Write ors("name"& ":" & ors("age"& "<br/>"
12    ors.MoveNext
13Loop
14Response.Write "总计:" & ors.RecordCount & "<br/>"
15Response.Write "----------------------------------<br/><br/>"
16
17
18Response.Write "二次检索:Filter(name like '王%')<br/>"
19Response.Write "----------------------------------<br/><br/>"
20ors.Filter = "name like '王%'"
21If not(oRs.Eof and ors.Bof) Then ors.MoveFirst
22Do while not ors.Eof
23    Response.Write ors("name"& ":" & ors("age"& "<br/>"
24    ors.MoveNext
25Loop
26Response.Write "总计:" & ors.RecordCount & "<br/>"
27Response.Write "----------------------------------<br/>"
28
29ors.Close
30Set ors = Nothing
31oConn.Close
32Set oConn = Nothing
33%>

结果:



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

List.asp:
 1<%
 2Set Session("conn")=Server.CreateObject("ADODB.Connection")
 3Session("conn").Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db1.mdb")
 4Set Session("rs"= Server.CreateObject("ADODB.RecordSet")
 5Session("rs").Open "select * from t1 where age>20",Session("conn"),1,2
 6
 7Response.Write "一次检索:select * from t1 where age>20<br/>"
 8Response.Write "----------------------------------<br/><br/>"
 9Do while not Session("rs").Eof
10    Response.Write Session("rs")("name"& ":" & Session("rs")("age"& "<br/>"
11    Session("rs").MoveNext
12Loop
13Response.Write "总计:" & Session("rs").RecordCount & "<br/>"
14Response.Write "----------------------------------<br/><br/>"
15%>
16<form action="search.asp" method="post" name="form1" target="_blank">
17  二次检索:
18    <input name="f" type="text" id="f">
19  <input type="submit" name="Submit" value="提交">
20</form>

Search.asp:
 1<%
 2Response.Write "二次检索条件:" & Trim(Request("f")) & "<br/>"
 3Response.Write "----------------------------------<br/><br/>"
 4
 5Session("rs").Filter = ""
 6Session("rs").Filter = Trim(Request("f"))
 7If not(Session("rs").Eof and Session("rs").Bof) Then Session("rs").MoveFirst
 8do while not Session("rs").Eof
 9    Response.Write Session("rs")("id"& ":" & Session("rs")("name"& "<br/>"
10    Session("rs").MoveNext
11loop
12Response.Write "总计:" & Session("rs").RecordCount & "<br/>"
13Response.Write "----------------------------------<br/>"
14%>

结果:



参考文章:

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
posted @   张远强  阅读(377)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示