分页控件结合分页存储过程

之前的在数据量大的时候很慢,如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
            DataTable dt = tmp.AllMsgList();
            DataView dv 
= dt.DefaultView;
            dv.Sort 
= orderByName + " " + orderByType;
            AspNetPager1.RecordCount 
= dt.Rows.Count;
            System.Text.StringBuilder sb 
= new System.Text.StringBuilder();
            PagedDataSource pds 
= new PagedDataSource();
            pds.DataSource 
= dv;
            pds.AllowPaging 
= true;
            pds.CurrentPageIndex 
= AspNetPager1.CurrentPageIndex - 1;
            pds.PageSize 
= AspNetPager1.PageSize;
            myGridView.DataSource 
= pds;
            myGridView.DataBind();

返回的是整个数据表,记录总数返回的数据集生成,排序也是对返回的数据集处理,为了方便。后来更新条码系统的时候,数据已经达到了3千多万,翻到下页的时候需要7秒钟。

 

现在新的方法,如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
            Manage.BLL.BaseInfor tmp = new Manage.BLL.BaseInfor();
            DataTable dt 
= tmp.ListBase(CurrentPageIndex.ToString(), PageSize.ToString(), strSort);
            Pagers.RecordCount 
= tmp.ListBaseCount();
            myGridView.DataSource 
= dt;
            myGridView.DataBind();

只是返回需要显示的数据,3千万的数据翻页不到1秒,可以传入排序字段,查询参数。

ContractedBlock.gif ExpandedBlockStart.gif Code
/*
Author:Jin
Date:2008/08/12
Note:数据分页
*/
ALTER PROCEDURE [dbo].[SP_ListBase]
(
    
@PageIndex int,
    
@PageSize int
)
AS
declare @PageLowerBound int,@PageUpperBound int
SET @PageLowerBound = @PageSize * @PageIndex - @PageSize
SET @PageUpperBound = @PageLowerBound + @PageSize + 1

select id,email,rowsid from (SELECT id,email,ROW_NUMBER() OVER (order by id)as rowsid FROM base)a
WHERE     rowsid > PageLowerBound AND rowsid < @PageUpperBound

如果需要传入排序字段,查询参数,增加一些参数即可。

经测试发现,SQL2005的Row_number()效率并不高,所有还是采用网上提供的方法:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
/*
  函数名称: GetRecordFromPage
  函数功能: 获取指定页的数据
  参数说明: @tblName      包含数据的表名
           @fldName      关键字段名
           @PageSize     每页记录数
           @PageIndex    要获取的页码
           @OrderType    排序类型, 0 - 升序, 1 - 降序
           @strWhere     查询条件 (注意: 不要加 where)
*/
ALTER PROCEDURE [dbo].[GetRecordFromPage]
    
@tblName      varchar(255),       -- 表名
    @fldName      varchar(255),       -- 字段名
    @PageSize     int = 25,           -- 页尺寸
    @PageIndex    int = 1,            -- 页码
    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
    @strWhere     varchar(2000= ''  -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL   varchar(6000)       -- 主语句
declare @strTmp   varchar(1000)       -- 临时变量
declare @strOrder varchar(500)        -- 排序类型

if @OrderType != 0
begin
    
set @strTmp = '<(select min'
    
set @strOrder = ' order by [' + @fldName + '] desc'
end
else
begin
    
set @strTmp = '>(select max'
    
set @strOrder = ' order by [' + @fldName +'] asc'
end

set @strSQL = 'select top ' + str(@PageSize+ ' * 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+ ' * from ['
        
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
        
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize+ ' ['
        
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
        
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1
begin
    
set @strTmp = ''
    
if @strWhere != ''
        
set @strTmp = ' where (' + @strWhere + ')'

    
set @strSQL = 'select top ' + str(@PageSize+ ' * from ['
        
+ @tblName + ']' + @strTmp + ' ' + @strOrder
end
exec (@strSQL)

转载于:https://www.cnblogs.com/cnaspnet/archive/2008/08/12/1265810.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值