您的位置:首页 > 数据库

DataReader分页 与 SQL三种分页方式 - Junval

2008-02-01 16:03 399 查看
导读:
  三种SQL分页法
  表中主键必须为标识列,[ID] int IDENTITY (1,1)
  1.分页方案一:(利用Not In和SELECT TOP分页)
  语句形式:
  SELECT TOP 10 *
  FROM TestTable
  WHERE (ID NOT IN
  (SELECT TOP 20 id
  FROM TestTable
  ORDER BY id))
  ORDER BY ID
  SELECT TOP 页大小 *
  FROM TestTable
  WHERE (ID NOT IN
  (SELECT TOP 页大小*页数 id
  FROM 表
  ORDER BY id))
  ORDER BY ID
  2.分页方案二:(利用ID大于多少和SELECT TOP分页)
  语句形式:
  SELECT TOP 10 *
  FROM TestTable
  WHERE (ID >
  (SELECT MAX(id)
  FROM (SELECT TOP 20 id
  FROM TestTable
  ORDER BY id) AS T))
  ORDER BY ID
  SELECT TOP 页大小 *
  FROM TestTable
  WHERE (ID >
  (SELECT MAX(id)
  FROM (SELECT TOP 页大小*页数 id
  FROM 表
  ORDER BY id) AS T))
  ORDER BY ID
  3.分页方案三:(利用SQL的游标存储过程分页)
  create procedure SqlPager
  @sqlstr nvarchar(4000), --查询字符串
  @currentpage int, --第N页
  @pagesize int --每页行数
  as
  set nocount on
  declare @P1 int, --P1是游标的id
  @rowcount int
  exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
  select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
  set @currentpage=(@currentpage-1)*@pagesize+1
  exec sp_cursorfetch @P1,16,@currentpage,@pagesize
  exec sp_cursorclose @P1
  set nocount off
  其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
  建议优化的时候,加上主键和索引,查询效率会提高。
  通过SQL 查询分析器,显示比较:结论是:
  分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
  分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
  分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用
  ------------------------------------------
  ASP.NET极速DataReader分页程序
  前段时间因工作需要写了段ASP.NET手工分页程序,几经修改优化,或许因本人知识有限,觉得其性能已经不能再提高多少。故将之发布上来与大家分享,欢迎大家提出更进一步的优化方法。
  [Gerry] 2006-5-9
  <%@ Page Language="C#" Debug="true" %>
  <%@ImportNamespace="System.Data"%>
  <%@ImportNamespace="System.Data.SqlClient"%>
  
  String PageName="wznPage"; //配置本页面的页面名字与本文件名相同
  String TableName="Ticket"; //配置要查询的数据库表的名字
  String IndexID="TicketAutoId"; //配置数据库表的主索引排序ID
  String ConnString="server=localhost;uid=sa;pwd=;database=qq3"; //配置数据库连接字符串
  int PageSize=7; //配置每页显示记录数
  SqlConnection conn; //定义连接数据库全局变量
  void Page_Load(Object src,EventArgs e)
  {
  conn =new SqlConnection(ConnString);
  conn.Open(); //建立与数据库的连接
  int RecordCount=0; //总共记录数
  int PageCount=0; //总共页数
  int CurrentPage=0; //当前页码
  
  RecordCount = CountRecord(); //计算总共有多少记录
  PageCount = RecordCount/PageSize; //计算总共有多少页 取整
  if (RecordCount%PageSize >0) {
  PageCount = PageCount + 1; //如果不整除则加一页来显示除后剩余记录
  }
  if (Request.QueryString["page"]!=null) {
  CurrentPage = Convert.ToInt32(Request.QueryString["page"]); //获得页的值
  }
  else {
  CurrentPage = 1;
  }
  //核心sql语句部分
  string sql;
  sql="select top "+PageSize+" * from "+ TableName +" where "+ IndexID +" not in (";
  sql+=" select top "+((CurrentPage-1)*PageSize)+" "+ IndexID +" from "+ TableName +" order by "+ IndexID +"";
  sql+=" ) order by "+ IndexID +"";
  //Response.Write("sql:"+sql);
  SqlCommand cmd=new SqlCommand(sql,conn);
  SqlDataReader myReader = cmd.ExecuteReader();
  string mainHtml="";
  int i=1;
  while(myReader.Read())
  {
  mainHtml+="";
  mainHtml+="";
  mainHtml+="";
  mainHtml+="";
  mainHtml+="";
  i++;
  }
  mainHtml+="
本页第"+ i +"条数据:
数据表第1个字段的值是:"+myReader[0].ToString().Trim()+"
数据表第2个字段的值是:"+myReader[1].ToString().Trim()+"
数据表第3个字段的值是:"+myReader[2].ToString().Trim()+"
";
  myReader.Close();
  int pagePre,pageNext;
  pagePre=CurrentPage-1;
  pageNext=CurrentPage+1;
  string pageHtml;
  if (pagePre==0) {
  pageHtml="首页 上页";
  }
  else {
  pageHtml="首页 上页";
  }
  if (pageNext>PageCount) {
  pageHtml+=" 下页 末页";
  }
  else {
  pageHtml+=" 下页";
  pageHtml+=" 末页";
  }
  mblist.InnerHtml = mainHtml; //给分页主内容标签赋值
  lblPageCount.Text = PageCount.ToString(); //给总页数标签赋值
  lblRecordCount.Text = RecordCount.ToString();//给总记录数标签赋值
  lblCurrentPage.Text = CurrentPage.ToString();//给当前页码标签赋值
  pagelist.InnerHtml = pageHtml; //给翻页链接标签赋值
  }
  //统计数据库表中记录总数的函数
  public int CountRecord()
  {
  int intCount = 0;
  string sql = "select count(*) from "+ TableName;
  SqlCommand cmd = new SqlCommand(sql,conn);
  SqlDataReader myReader = cmd.ExecuteReader();
  if(myReader.Read()) {
  intCount = Int32.Parse(myReader[0].ToString());
  }
  myReader.Close();
  return intCount;
  }
  
  
  
  
  #
  
    td {

  font-family: "宋体";

  font-size: 14px;

  }

  a:link {

  text-decoration: none;

  color: blue;

  }

  a:visited {

  text-decoration: none;

  color: blue;

  }

  a:hover {

  text-decoration: underline;

  color: blue;

  }

  a:active {

  text-decoration: none;

  color: blue;

  }

  -->
  
  
  
  
          
  
  
            
共有
  
  条记录 当前为
  
  /
  
  页
  
  
  
  
  
  Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1720965

本文转自
http://blog.csdn.net/junval/archive/2007/08/01/1720965.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: