子查询的TOP我是用(页大小*(页数-1))算出来的。 20*(3000-1)即第3000页内容用了一分多钟!!!自己看了一便,才发现这句话打错了。

解决方案 »

  1.   

    你查询出总数这完全可以,但是你的程序其实不应该显示超过500页,应该 PageIndexChanging 事件处理程序中写:  Int32 PageNumber=e.NewPageIndex;
      if(PageNumber>500)
      {
        Page.ClientScript.RegisterStartupScript(this.GetType(),"page error",
          "alert('无法显示过多翻页数据。请缩小查询范围进行查询列表。')",true);
        PageNumber=500;
      }
      .......  //设置页号、绑定数据
    我看了一下百度,在我显示740条数据(74页)的时候,就已经不翻页了。
      

  2.   

    其实这里我应该给你把示例写成50页,而不是500页。因为百度也不过那样而已嘛。关于翻页的讨论学究气比较重,仅仅纠缠于SQL查询等技术写法,少了一些更为必要的东西的描述。
      

  3.   

    哦,忘记了说一件重要的事情:当你确定将控制逻辑限制为仅列出500条明细(假设每页20条记录那么就是仅列出25页,这个数量不大)时,那些对“分页算法”的过分追捧就没有必要了,你完全可以用ADO.NET的:  System.Data.Common.DbDataAdapter.Fill(dataSet,startRecord,maxRecords,srcTable)或者你的可绑定的ui控件的原有的分页功能。
      

  4.   

    你的存储过程效率也太低了!给你个(测试过,效率很高,尤其是海量数据)
    ALTER PROCEDURE pager@tblName   varchar(255),       -- 表名@strGetFields varchar(1000),  -- 需要返回的列@fldName varchar(255),      -- 排序的字段名@PageSize   int ,          -- 页尺寸@PageIndex  int,           -- 页码@doCount  int ,   -- 返回记录总数, 非0 值则返回@OrderType int = 0,  -- 设置排序类型, 非0 值则降序@strWhere  varchar(1500) = ''  -- 查询条件(注意: 不要加where)ASdeclare @strSQL   varchar(5000)       -- 主语句declare @strTmp   varchar(110)        -- 临时变量declare @strOrder varchar(400)        -- 排序类型 if @doCount != 0     begin    if @strWhere !=''    set @strSQL = 'select count(*) as Total from [''' + @tblName + '''] where '+@strWhere    else    set @strSQL = 'select count(*) as Total from [''' + @tblName + ''']'end  --以上代码的意思是如果@doCount传递过来的不是,就执行总数统计。以下的所有代码都是@doCount为的情况elsebegin if @OrderType != 0begin    set @strTmp = '<(select min'set @strOrder = ' order by [''' + @fldName +'''] desc'--如果@OrderType不是,就执行降序!endelsebegin    set @strTmp = '>(select max'    set @strOrder = ' order by [''' + @fldName +'''] asc'end if @PageIndex = 1   --如果是第一页就执行以上代码,这样会加快执行速度begin    if @strWhere != ''       set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from [''' + @tblName + '''] where ''' + @strWhere + ''' ' + @strOrder     else     set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['''+ @tblName + '''] '+ @strOrderendelsebegin--以下代码赋予了@strSQL以真正执行的SQL代码set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['''    + @tblName + '''] where [''' + @fldName + ''']' + @strTmp + '(['''+ @fldName + ''') from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['''+ @fldName + '''] from [''' + @tblName + ''']' + @strOrder + ') as tblTmp)'+ @strOrder if @strWhere != ''    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['''        + @tblName + '''] where [''' + @fldName + ''']' + @strTmp + '(['''        + @fldName + ''']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['''        + @fldName + '''] from [''' + @tblName + '''] where ' + @strWhere + ' '        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrderend end   exec (@strSQL)
      

  5.   

    --以下代码赋予了@strSQL以真正执行的SQL代码set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['''    + @tblName + '''] where [''' + @fldName + ''']' + @strTmp + '(['''+ @fldName + ''') from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['''+ @fldName + '''] from [''' + @tblName + ''']' + @strOrder + ') as tblTmp)'+ @strOrder(['''+ @fldName + ''')换成(['''+ @fldName + ''']),少了]