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

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

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

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

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

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

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

结果:

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

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

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

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

结果:

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

参考文章:

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

相关文章:

  • 2021-12-30
  • 2021-06-20
  • 2021-11-11
  • 2021-10-29
  • 2022-03-14
  • 2021-05-21
  • 2022-03-14
  • 2021-11-19
猜你喜欢
  • 2021-04-06
  • 2021-11-23
  • 2022-01-17
  • 2021-12-17
  • 2021-05-13
  • 2022-12-23
  • 2021-05-24
相关资源
相似解决方案