关于分页类的改进....

类别:Asp 点击:0 评论:0 推荐:

原文页类的代码如下:

<script language="vbscript" runat="server">

'----------------------------------------
'     数据库分页类 for sqlserver.
'     作者: Robin_Zhang ([email protected])
'     请保留此信息,谢谢。
'----------------------------------------
class splitpage

 public curr_page  '//当前页码
 public istart           '//分页开始的记录位置
 public iend             '//分页结束的记录位置
 public countpage        '//页数
 public conn             '//数据库连接对像
 public perpagecount     '//每页显示的记录个数
 public countrecord      '//总记录数  
 
 public tablename        '//表或视图名称
 public key              '//主键
 public condition         '//查询条件
 public orderby          '//排序条件
 public sql_count        '//求总记录数的sql语句
 public sql_search       '//查询sql语句
 
 public split_record     '//得到的分页记录集
 public url              '//当前页面的url
 public bar1             '//翻页条
 public bar2             '//翻页条
 
 public solitude_sql  '传送单独的sql语句
 
 
 '//-------------------private 内部方法集合-----------------------
 
 '得到查询的记录数,总页数,sql语句,得到当前页数
 private sub getCountRecord()
  if isnull(solitude_sql) or isempty(solitude_sql) then
   sql = "select count("& key &") as totalvalue from "& tablename & condition
  else
   sql = "select count(*) as totalvalue from ("&solitude_sql&") temptablea"
  end if

'  response.write "<hr>"&sql
'  response.end
  
  set rs = conn.execute(sql)
 
  
  countrecord = rs("totalvalue")
  rs.close
  set rs=nothing
  sql_count = sql
  countpage = abs(int(-(countrecord/perpagecount)))
  if curr_page < 1 then curr_page = 1
  if curr_page >countpage then curr_page = countpage
  
  
  
 end sub
 
 '根据当前页码和每页显示的个数算出起始位置
 private sub count_istart()
  istart = clng((curr_page-1) * perpagecount)
  if istart > clng(countrecord) then istart = clng(countrecord)
  if istart < 0 then istart = 0
 end sub

 
 '根据当前页码和每页显示的个数算出结束位置
 private sub count_iend()
  iend = clng(istart + perpagecount)
  if iend > clng(countrecord) then iend = clng(countrecord)
 end sub
 
 private function get_record()
  if isnull(solitude_sql) or isempty(solitude_sql) then
   sql = "select * from "& tablename &" where "& key &" not in (select top "& istart &" "& key &" from "& tablename & condition & orderby &") and "& key &" in (select top "& iend &" "& key &" from "& tablename & condition & orderby & ")" & orderby
  else
   sql = "select * from ("& solitude_sql &")a where "& key &" not in (select top "& istart &" "& key &" from ("& solitude_sql &")b"& condition & orderby &") and "& key &" in (select top "& iend &" "& key &" from ("& solitude_sql &")c"& condition & orderby & ")" & orderby
  end if
  'response.write sql

  
  
  sql_search = sql
  set get_record = conn.execute(sql)
  
 end function
 
 private sub get_url()
  url = Request.ServerVariables("url") & "?" & Request.ServerVariables("query_string")
  pos = InStrRev(url,"&page")-1
  if pos > 0 then
   url = mid(url,1,pos)
  
  end if
  
  if Request.ServerVariables("query_string") = "" then
   url = Request.ServerVariables("url") & "?1=1"
  end if
 end sub
 
 private function get_bar_gb2312()
 
  
  bar1 = "目前为第 "& curr_page &"页 共计 "& countpage &" 页 共有 "& countrecord &" 笔资料"
  a1 = "<a href='"& url &"&page=1'>首页</a> "
  a2 = "<a href='"& url &"&page="& curr_page-1 &"'>上页</a> "
  a3 = "<a href='"& url &"&page="& curr_page+1 &"'>下页</a> "
  a4 = "<a href='"& url &"&page="& countpage &"'>末页</a> "
  curr_page = clng(curr_page) 
 
  if curr_page <=1 then
   a1 = "首页 "
   a2 = "上页 "
  end if
  
  if curr_page >= clng(countpage) then
   a3 = "下页 "
   a4 = "末页 "
  end if
  
  bar2 = a1 & a2 & a3 & a4
  
  
  

  
 end function
 
 private function get_bar_big5()
 end function
  
 
 
 
 '//---------------------public 供外部调用--------------------------
 
 '存取一条sql
 public sub set_solitude_sql(sql)
  solitude_sql = sql
 end sub
 '取得数据库连接的方法
 public sub setConn(o)
  set conn = o
 end sub
 
 '设定每页显示记录的个数
 public sub setPerpagecount(o)
  perpagecount = o
 end sub
 
 '设定查询的表名或视图名称
 public sub setTablename(atablename)
  tablename = atablename
 end sub
 
 '设定主键
 public sub setKey(akey)
  key = akey
 end sub
 
 '设定查询条件
 public sub setCondition(acondition)
  condition = " " & acondition
 
 end sub
 
 '设定排序依据
 public sub setOrderby(aorderby)
  orderby = " " & aorderby
 end sub
 
 

 '设定当前页码
 public sub setCurr_page(o)
  if o <> "" then
   curr_page = clng(o)
  else
   curr_page = 1
  end if
 end sub
 
 public sub execute()
  call getCountRecord()
  call count_istart()
  call count_iend()
  call get_url()
  set split_record = get_record()
  call get_bar_gb2312()
 end sub
 
 

 

end class
</script>






以前的语句中有一个not in和一个in
select * from table_name where id not in (select top 100 id from table_name order by id desc) and id in (select top 200 id from table_name order by id desc) order by id desc


考验到in会遍历整张表.所以做以下修改...

select top 10 * from table_name where id>(select max (id) from (select top ((页码-1)*10) id from table_name order by id) as table_temp) order by id

本文地址:http://com.8s8s.com/it/it8009.htm