使用Filter实现信息的二次检索
思考一个问题:怎么实现在第一次检索的基础上进行二次检索?
通常,我们的做法是第一次检索时保存检索条件,在第二次行检索时组合两次检索条件对数据库进行一次新的查询,如:
第一次检索:Select * from table where age>18
第二次检索:Select * from table where age>18 and name like 'zh%'
这样做虽可以实现我们所要的结果,但效率上个人认为却大打了折扣!
能不能缓存第一次检索的记录集,第二次检索时只在缓存的记录集上进行,而不是重新对数据库进行查询?
RecordSet对象有个属性Filter,它的作用是通过添加条件以控制欲显示的记录集,但并不影响原本的记录集!我们来看下怎么用它实现二次检索:
结果:

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

参考文章:
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
通常,我们的做法是第一次检索时保存检索条件,在第二次行检索时组合两次检索条件对数据库进行一次新的查询,如:
第一次检索:Select * from table where age>18
第二次检索:Select * from table where age>18 and name like 'zh%'
这样做虽可以实现我们所要的结果,但效率上个人认为却大打了折扣!
能不能缓存第一次检索的记录集,第二次检索时只在缓存的记录集上进行,而不是重新对数据库进行查询?
RecordSet对象有个属性Filter,它的作用是通过添加条件以控制欲显示的记录集,但并不影响原本的记录集!我们来看下怎么用它实现二次检索:
1
<%
2
Dim oConn,oRs
3
Set oConn=Server.CreateObject("ADODB.Connection")
4
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db1.mdb")
5
Set ors = Server.CreateObject("ADODB.RecordSet")
6
ors.Open "select * from t1 where age>20",oConn,1,2
7
8
Response.Write "一次检索:select * from t1 where age>20<br/>"
9
Response.Write "----------------------------------<br/><br/>"
10
Do while not ors.Eof
11
Response.Write ors("name") & ":" & ors("age") & "<br/>"
12
ors.MoveNext
13
Loop
14
Response.Write "总计:" & ors.RecordCount & "<br/>"
15
Response.Write "----------------------------------<br/><br/>"
16
17
18
Response.Write "二次检索:Filter(name like '王%')<br/>"
19
Response.Write "----------------------------------<br/><br/>"
20
ors.Filter = "name like '王%'"
21
If not(oRs.Eof and ors.Bof) Then ors.MoveFirst
22
Do while not ors.Eof
23
Response.Write ors("name") & ":" & ors("age") & "<br/>"
24
ors.MoveNext
25
Loop
26
Response.Write "总计:" & ors.RecordCount & "<br/>"
27
Response.Write "----------------------------------<br/>"
28
29
ors.Close
30
Set ors = Nothing
31
oConn.Close
32
Set oConn = Nothing
33
%>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

结果:

但这还有一个问题:很多情况下两次检索并不是同时进行的,而是在第一次检索完成后手动输入条件再进行二次检索,所以我们得想办法在二次检索时第一次检索的记录集仍存在!我们可以用Session对象!将Connection对象和RecordSet对象都保存在Session中,实现如下:
List.asp:
1
<%
2
Set Session("conn")=Server.CreateObject("ADODB.Connection")
3
Session("conn").Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db1.mdb")
4
Set Session("rs") = Server.CreateObject("ADODB.RecordSet")
5
Session("rs").Open "select * from t1 where age>20",Session("conn"),1,2
6
7
Response.Write "一次检索:select * from t1 where age>20<br/>"
8
Response.Write "----------------------------------<br/><br/>"
9
Do while not Session("rs").Eof
10
Response.Write Session("rs")("name") & ":" & Session("rs")("age") & "<br/>"
11
Session("rs").MoveNext
12
Loop
13
Response.Write "总计:" & Session("rs").RecordCount & "<br/>"
14
Response.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>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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

2

3

4

5

6

7

8

9

10

11

12

13

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
------------------------------------------------
dnawo:天才在于勤奋,知识在于积累!
分类:
ASP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架