使用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
Dim oConn,oRs3
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,27

8
Response.Write "一次检索:select * from t1 where age>20<br/>"9
Response.Write "----------------------------------<br/><br/>"10
Do while not ors.Eof11
Response.Write ors("name") & ":" & ors("age") & "<br/>"12
ors.MoveNext13
Loop14
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.MoveFirst22
Do while not ors.Eof23
Response.Write ors("name") & ":" & ors("age") & "<br/>"24
ors.MoveNext25
Loop26
Response.Write "总计:" & ors.RecordCount & "<br/>"27
Response.Write "----------------------------------<br/>"28

29
ors.Close30
Set ors = Nothing31
oConn.Close32
Set oConn = Nothing33
%>结果:

但这还有一个问题:很多情况下两次检索并不是同时进行的,而是在第一次检索完成后手动输入条件再进行二次检索,所以我们得想办法在二次检索时第一次检索的记录集仍存在!我们可以用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
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,26

7
Response.Write "一次检索:select * from t1 where age>20<br/>"8
Response.Write "----------------------------------<br/><br/>"9
Do while not Session("rs").Eof10
Response.Write Session("rs")("name") & ":" & Session("rs")("age") & "<br/>"11
Session("rs").MoveNext12
Loop13
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>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
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").MoveFirst8
do while not Session("rs").Eof9
Response.Write Session("rs")("id") & ":" & Session("rs")("name") & "<br/>"10
Session("rs").MoveNext11
loop12
Response.Write "总计:" & Session("rs").RecordCount & "<br/>"13
Response.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
------------------------------------------------
dnawo:天才在于勤奋,知识在于积累!

浙公网安备 33010602011771号