asp.net具体分页原理是怎么实现的,尤其是百万数据量时候还有个问题
举个例子,
假如,我只想读取第56页数据,那肯定是只读出第56页数据,就OK了,这样多好,减轻数据库压力
访问数据页快,请问大家,这个怎么实现呢?最最优化的方法

解决方案 »

  1.   

    只读取第56页数据的,asp.net的控件还不能实现,除非你自己写一个sql分页的存储过程
      

  2.   

    恩,就是,自己写一个sql分页的存储过程
    怎么写,大哥,可以告诉我吗?
      

  3.   

    Create PROCEDURE [dbo].[Common_Pagination] @tablename varchar(100), 
    @tablefield varchar(20), 
    @where varchar(5000), 
    @orderby varchar(500), 
    @fieldlist varchar(1000), 
    @curpage int, 
    @page_record int, 
    @sort varchar(8) AS DECLARE @cmd varchar(8000) 
    DECLARE @uprecord int 
    DECLARE @Op varchar(2) -- 操作符 
    DECLARE @max_min varchar(4) -- 最大/最小计算 SET @op = '<' 
    SET @max_min = 'MIN' IF @sort = 'asc' 
    BEGIN 
    SET @Op = '>' 
    SET @max_min = 'MAX' 
     SET @uprecord=@curpage * @page_record 
    SET @where = '('+@where+')' IF @curpage = 0 
    SET @cmd = 'SELECT TOP '+cast(@page_record AS NVARCHAR)+' '+@fieldlist+' FROM '+@tablename+' WHERE '+@where+' '+@orderby 
    ELSE 
    SET @cmd = 'SELECT TOP '+cast(@page_record AS NVARCHAR)+' '+@fieldlist+' FROM '+@tablename+' WHERE '+@where+' AND '+@tablefield+' 
    '+@op+' (SELECT '+@max_min+'('+@tablefield+') FROM (SELECT TOP '+cast(@uprecord AS NVARCHAR)+' '+@tablefield+' FROM '+@tablename+' WHERE 
    '+@where+' '+@orderby+') AS TmpTbl ) AND '+@where+' '+@orderby EXEC(@cmd) 
    PRINT(@cmd) 
    GO 
    [/code]
      

  4.   

    上面的,怎么成那样了?Create PROCEDURE [dbo].[Common_Pagination] @tablename varchar(100), 
    @tablefield varchar(20), 
    @where varchar(5000), 
    @orderby varchar(500), 
    @fieldlist varchar(1000), 
    @curpage int, 
    @page_record int, 
    @sort varchar(8) AS BEGIN DECLARE @cmd varchar(8000) 
    DECLARE @uprecord int 
    DECLARE @Op varchar(2) -- 操作符 
    DECLARE @max_min varchar(4) -- 最大/最小计算 SET @op = '<' 
    SET @max_min = 'MIN' IF @sort = 'asc' 
    BEGIN 
    SET @Op = '>' 
    SET @max_min = 'MAX' 
    END SET @uprecord=@curpage * @page_record 
    SET @where = '('+@where+')' IF @curpage = 0 
    SET @cmd = 'SELECT TOP '+cast(@page_record AS NVARCHAR)+' '+@fieldlist+' FROM '+@tablename+' WHERE '+@where+' '+@orderby 
    ELSE 
    SET @cmd = 'SELECT TOP '+cast(@page_record AS NVARCHAR)+' '+@fieldlist+' FROM '+@tablename+' WHERE '+@where+' AND '+@tablefield+' 
    '+@op+' (SELECT '+@max_min+'('+@tablefield+') FROM (SELECT TOP '+cast(@uprecord AS NVARCHAR)+' '+@tablefield+' FROM '+@tablename+' WHERE 
    '+@where+' '+@orderby+') AS TmpTbl ) AND '+@where+' '+@orderby EXEC(@cmd) 
    PRINT(@cmd) END 
    GO 
      

  5.   

    看看这个:
    http://blog.csdn.net/46539492/archive/2008/04/02/2244627.aspx
      

  6.   


    CREATE procedure main_table_pwqzc
    (@pagesize int,
    @pageindex int,
    @docount bit,
    @this_id)
    as
    if(@docount=1)
    begin
    select count(id) from luntan where this_id=@this_id
    end
    else
    begin
    declare @indextable table(id int identity(1,1),nid int)
    declare @PageLowerBound int
    declare @PageUpperBound int
    set @PageLowerBound=(@pageindex-1)*@pagesize
    set @PageUpperBound=@PageLowerBound+@pagesize
    set rowcount @PageUpperBound
    insert into @indextable(nid) select id from luntan where this_id=@this_id order by reply_time desc
    select a.* from luntan a,@indextable t where a.id=t.nid
    and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
    end
    GO存储过程会根据传入的参数@docount来确定是不是要返回所有要分页的记录总数
    特别是这两行
    set rowcount @PageUpperBound
    insert into @indextable(nid) select id from luntan where this_id=@this_id order by reply_time desc真的是妙不可言!!set rowcount @PageUpperBound当记录数达到@PageUpperBound时就会停止处理查询
    ,select id 只把id列取出放到临时表里,select a.* from luntan a,@indextable t where a.id=t.nid
    and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
    而这句也只从表中取出所需要的记录,而不是所有的记录,结合起来,极大的提高了效率!!
    妙啊,真的妙!!!!
    CREATE PROCEDURE Paging_RowCount
    (
    @Tables varchar(1000),
    @PK varchar(100),
    @Sort varchar(200) = NULL,
    @PageNumber int = 1,
    @PageSize int = 10,
    @Fields varchar(1000) = '*',
    @Filter varchar(1000) = NULL,
    @Group varchar(1000) = NULL)
    AS/*Default Sorting*/
    IF @Sort IS NULL OR @Sort = ''
     SET @Sort = @PK/*Find the @PK type*/
    DECLARE @SortTable varchar(100)
    DECLARE @SortName varchar(100)
    DECLARE @strSortColumn varchar(200)
    DECLARE @operator char(2)
    DECLARE @type varchar(100)
    DECLARE @prec int/*Set sorting variables.*/ 
    IF CHARINDEX('DESC',@Sort)>0
     BEGIN
      SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
      SET @operator = '<='
     END
    ELSE
     BEGIN
      IF CHARINDEX('ASC', @Sort) = 0
       SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
      SET @operator = '>='
     END
    IF CHARINDEX('.', @strSortColumn) > 0
     BEGIN
      SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
      SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
     END
    ELSE
     BEGIN
      SET @SortTable = @Tables
      SET @SortName = @strSortColumn
     ENDSELECT @type=t.name, @prec=c.prec
    FROM sysobjects o 
    JOIN syscolumns c on o.id=c.id
    JOIN systypes t on c.xusertype=t.xusertype
    WHERE o.name = @SortTable AND c.name = @SortNameIF CHARINDEX('char', @type) > 0
       SET @type = @type + '(' + CAST(@prec AS varchar) + ')'DECLARE @strPageSize varchar(50)
    DECLARE @strStartRow varchar(50)
    DECLARE @strFilter varchar(1000)
    DECLARE @strSimpleFilter varchar(1000)
    DECLARE @strGroup varchar(1000)/*Default Page Number*/
    IF @PageNumber < 1
     SET @PageNumber = 1/*Set paging variables.*/
    SET @strPageSize = CAST(@PageSize AS varchar(50))
    SET @strStartRow = CAST(((@PageNumber - 1)*@PageSize + 1) AS varchar(50))/*Set filter & group variables.*/
    IF @Filter IS NOT NULL AND @Filter != ''
     BEGIN
      SET @strFilter = ' WHERE ' + @Filter + ' '
      SET @strSimpleFilter = ' AND ' + @Filter + ' '
     END
    ELSE
     BEGIN
      SET @strSimpleFilter = ''
      SET @strFilter = ''
     END
    IF @Group IS NOT NULL AND @Group != ''
     SET @strGroup = ' GROUP BY ' + @Group + ' '
    ELSE
     SET @strGroup = ''
     
    /*Execute dynamic query*/ 
    EXEC(
    '
    DECLARE @SortColumn ' + @type + '
    SET ROWCOUNT ' + @strStartRow + '
    SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
    SET ROWCOUNT ' + @strPageSize + '
    SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
    '
    )
    GO
      

  7.   

    1.sql 分页存储过程,这个网上搜搜就有了.
    2.页面上加button控制,button显示为当前页码,选择某一具体页码是,读取该页码对应的数据库记录.
      Button如这种效果,每组显示10个或者多个|<< << < 1 2 3 4 5 6 7 8 9 10 > >> >>|
    ...
    |<< << < 51 52 53 54 55 56 57 58 59 60 > >> >>|
      

  8.   

    baidu/google 会用吗?http://www.baidu.com/baidu?wd=asp.net+%B7%D6%D2%B3&tn=monline_dghttp://www.baidu.com/s?tn=monline_dg&ie=gb2312&bs=asp.net+%B7%D6%D2%B3&sr=&z=&cl=3&f=8&wd=asp.net+%B4%E6%B4%A2%B9%FD%B3%CC%B7%D6%D2%B3&ct=0
      

  9.   

    《用AjaxPro实现无刷新翻页效果及数据库分页技术介绍》
    题外话:经不住一些朋友的一再要求,一气写了这么几篇Ajax方面的文章,这其中大部分代码都是从我的项目中摘取出来的,不过为了演示整个程序的框架结构,所以在演示程序代码里不会有大量与实际相关的业务逻辑处理,但是这并不妨碍你利用这些理论做出复杂的、完善的应用。一、数据库分页理论在实际项目中经常会遇到一个表里有几K、几M以上的数据,而呈现给用户时并不会一下子都显示出来,所以都是分批展示给用户,这样一来可以减小网络传输量,二来也减轻服务器压力。本文展示了在数据库中如何实现分页,如何利用AjaxPro实现无刷新分页。
    http://blog.csdn.net/zhoufoxcn/archive/2008/03/12/2174234.aspx
      

  10.   

    给个你吧!
    我写的效率较高
    ALTER PROCEDURE PageSplit
    (
      @PageCurrent int, --当前页
      @PageCount int, --每页的数量
      @PageTotal int output --总共有多少记录
    )
    AS
    declare @Start int --当前页的第一行是总记录的第几行
    declare @Last int  --当前页的最后一行是总记录的第几行

    set @Start=(@PageCurrent-1)*@PageCount+1
    set @Last=@PageCurrent*@PageCount

    --得到总记录数
    set @PageTotal=(select count(*) from NewsInfo)

    --查询的信息
    select NewsTitle,NewsDate from NewsInfo where NewsID between @Start and @Last order by NewsDate desc

    RETURN
    public partial class News_PageSplit : System.Web.UI.Page
    {
        int PageCount = 5;
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                int PageCurrent =1;
                
                ShowMes(PageCurrent, PageCount);
              
            }
        }
        public void ShowMes(int pagecurrent,int pagecount)
        {
            SqlConnection Conn = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["PhotoConn"]);
            Conn.Open();
            SqlDataAdapter da =new SqlDataAdapter ("PageSplit",Conn);
            da.SelectCommand.CommandType=CommandType.StoredProcedure;
            //SqlParameter[] myparam ={  new SqlParameter("@PageCurrent",pagecurrent),
            //                           new SqlParameter("@PageCount",pagecount)                          
            //                        };
           da.SelectCommand.Parameters.Add("@PageCurrent", pagecurrent);
           da.SelectCommand.Parameters.Add("@pageCount",pagecount);
           da.SelectCommand.Parameters.Add("@PageTotal",SqlDbType.Int);
           da.SelectCommand.Parameters["@PageTotal"].Direction = ParameterDirection.Output;        //绑定数据源       DataSet ds = new DataSet();
           da.Fill(ds);
            //总记录数
           double total = Convert.ToDouble(da.SelectCommand.Parameters["@PageTotal"].Value);
            //总页数
           double page = Math.Ceiling(total / PageCount);
            //当前页
           LabCurrent.Text = pagecurrent.ToString();
           //总共有多少页
           LabCount.Text = page.ToString();       GridView1.DataSource = ds;
           GridView1.DataBind();       BindButton();
        }
        protected void LinkButton2_Click(object sender, EventArgs e)
        {
                int current = int.Parse(LabCurrent.Text) - 1;
                LabCurrent.Text = current.ToString();
                ShowMes(current, PageCount);
          
        }
        protected void LinkButton1_Click(object sender, EventArgs e)
        {
                int current = int.Parse(LabCurrent.Text) + 1;
                LabCurrent.Text = current.ToString();
                ShowMes(current, PageCount);
        }
        public void BindButton()
        {
            if (LabCurrent.Text == "1")
            {
                LbPrev.Enabled = false;
            }
            else
            {
                LbPrev.Enabled = true;
            }        if (LabCurrent.Text == LabCount.Text)
            {
                LBnext.Enabled = false;
            }
            else
            {
                LBnext.Enabled = true;
            }
        }
    }
      

  11.   

    在sqlserver2005里面就好了
    他的记录有个编号
    可以指定到多少条记录之后查询
      

  12.   

    select top 10 * from table1 where id not in (select top 10 id from table1)类似于这样的..是最容易的..不过数据多了.效率不高..