asp.net存储过程分页+GridView控件 几百万数据 超快

存储过程:---亲测275万数据,分页速度N快

复制代码
create   PROCEDURE  PageList 
@tablename   nvarchar ( 50 ),
@fieldname   nvarchar ( 50 ) = ' * ' ,
@pagesize   int , -- 每页显示记录条数
@currentpage   int , -- 第几页
@orderid   nvarchar ( 50 ), -- 主键排序
@sort   int , -- 排序方式,1表示升序,0表示降序排列
@rowcount   int  output, -- 总记录数,共有几条信息
@pagecount   int  output -- 总页数,共有多少页
AS
declare   @countsql   nvarchar ( 50 )
declare   @sql   nvarchar ( 200 )
declare   @subsql   nvarchar ( 100 ) -- not in子sql语句
declare   @tmpOrderid   nvarchar ( 50
-- 返回总记录数,并赋值给输出参数@rowcount
set   @countsql = ' select @totalcount=count(*) from  ' + @tablename
exec  sp_executesql  @countsql ,N ' @totalcount int out ' , @rowcount  output

-- 判断字段名是否为空
if   @fieldname   is   null   or   @fieldname = ''
set   @fieldname = '  *  '

-- 判断是否排序及排序方式
if   @orderid   is   null   or   @orderid = ''
set   @tmpOrderid = '   '
else
begin  
if   @sort = 0
set   @tmpOrderid = ' order by  ' + @orderid + '  desc '
else
set   @tmpOrderid = ' order by  ' + @orderid + '  asc '
end

-- 计算页数
if   @rowcount % @pagesize > 0
set   @pagecount   = ( @rowcount / @pagesize ) + 1 ;
else
set   @pagecount = @rowcount / @pagesize ;

-- 分页算法实现
set   @subsql = ' select top ' + str ( @pagesize * ( @currentpage - 1 )) + '   ' + @orderid + '  from  ' + @tablename + '   ' + @tmpOrderid
set   @sql = ' select top ' + str ( @pagesize ) + '   ' + @fieldname + '  from  ' + @tablename + '  where  ' + @orderid + '  not in ( ' + @subsql + ' ) ' + @tmpOrderid
exec ( @sql )
复制代码

 

 aspx文件:

 

复制代码
< asp:GridView ID = " GridView1 "  runat = " server " >
        
</ asp:GridView >
        
</ div >
        第
< asp:Label ID = " lblCurrent "  runat = " server " ></ asp:Label > 页  |  每页 < asp:Label ID = " lblPageSize "
            runat
= " server " ></ asp:Label > 条  |  共有 < asp:Label ID = " lblPageTotal "  runat = " server " ></ asp:Label > 页  |   共有 < asp:Label ID = " lblRowsTotal "
            runat
= " server " ></ asp:Label > 条信息  |
        
< asp:HyperLink ID = " hlFirst "  runat = " server " > 首页 </ asp:HyperLink >
        
|
        
< asp:HyperLink ID = " hlPrev "  runat = " server " > 上一页 </ asp:HyperLink >
        
|
        
< asp:HyperLink ID = " hlNext "  runat = " server " > 下一页 </ asp:HyperLink >
        
|
        
< asp:HyperLink ID = " hlLast "  runat = " server " > 尾页 </ asp:HyperLink >< br  />
复制代码

 

 

.cs文件:

 

复制代码
protected   void  Page_Load( object  sender, EventArgs e)
    {
        
int  CurrentPage,RowCount,PageCount;
        
int  PageSize  =   2 ;
        
if  (Request[ " CurrentPage " ==   null || Convert.ToInt32(Request[ " CurrentPage " ]) <   1 )
        {
            CurrentPage
= 1 ;
        }
        
else
        {
            CurrentPage
= Convert.ToInt32(Request[ " CurrentPage " ]);
        }

        
// 数据库操作
        SqlConnection sqlconn  =   new  SqlConnection(ConfigurationManager.AppSettings[ " ConnStr " ].ToString());
        SqlCommand cmd 
=   new  SqlCommand( " pagelist " , sqlconn);
        cmd.CommandType 
=  CommandType.StoredProcedure;
        cmd.Connection 
=  sqlconn;
        SqlParameter[] prams 
= {
                               
new  SqlParameter( " @tablename " ,SqlDbType.NVarChar, 50 ),
                               
new  SqlParameter( " @fieldname " ,SqlDbType.NVarChar, 50 ),
                               
new  SqlParameter( " @pagesize " ,SqlDbType.Int),
                               
new  SqlParameter( " @currentpage " ,SqlDbType.Int),
                               
new  SqlParameter( " @orderid " ,SqlDbType.NVarChar, 50 ),
                               
new  SqlParameter( " @sort " ,SqlDbType.Int),
                               
new  SqlParameter( " @rowcount " ,SqlDbType.Int),
                               
new  SqlParameter( " @pagecount " ,SqlDbType.Int)};
        prams[
0 ].Value  =   " news " ; // 表名
        prams[ 1 ].Value  = " * " ; // 字段名
        prams[ 2 ].Value  = PageSize; // 每页显示条数
        prams[ 3 ].Value  = CurrentPage; // 当前页数
        prams[ 4 ].Value  = " id " ; // 主键
        prams[ 5 ].Value  = 1 ; // 排序方式,0表示降序,1表示升序
        prams[ 6 ].Direction  =  ParameterDirection.Output; // 总记录数
        prams[ 7 ].Direction  =  ParameterDirection.Output; // 总页数
         foreach (SqlParameter pram  in  prams)
        {
            cmd.Parameters.Add(pram);
        }
        sqlconn.Open();
        SqlDataAdapter sda 
=   new  SqlDataAdapter();
        DataSet ds 
=   new  DataSet();
        sda.SelectCommand 
=  cmd;
        sqlconn.Close();
        sda.Fill(ds);
        
// 数据库操作结束

        RowCount 
=  ( int )cmd.Parameters[ " @rowcount " ].Value;
        PageCount 
= ( int )cmd.Parameters[ " @pagecount " ].Value;
        
        
if  (CurrentPage > PageCount)
        {
            Response.Redirect(
" CutPage.aspx?CurrentPage= " + Convert.ToString(PageCount));
            Response.End();
        }
        
this .lblCurrent.Text  =  Convert.ToString(CurrentPage);
        
this .lblPageTotal.Text  =  Convert.ToString(PageCount);
        
this .lblRowsTotal.Text  =  Convert.ToString(RowCount);
        
this .lblPageSize.Text  =  Convert.ToString(PageSize);

        
this .hlFirst.NavigateUrl  =   " CutPage.aspx?CurrentPage=1 " ;
        
this .hlPrev.NavigateUrl  =   " CutPage.aspx?CurrentPage= "   +  Convert.ToString(CurrentPage - 1 );
        
this .hlNext.NavigateUrl  =   " CutPage.aspx?CurrentPage= "   +  Convert.ToString(CurrentPage + 1 );
        
this .hlLast.NavigateUrl  =   " CutPage.aspx?CurrentPage= "   +  Convert.ToString(PageCount);
        
if  (Convert.ToInt32(CurrentPage)  ==   1 )
        {
            
this .hlPrev.Enabled  =   false ;
            
this .hlFirst.Enabled  =   false ;
        }
        
if  (Convert.ToInt32(CurrentPage)  ==  PageCount)
        {
            
this .hlNext.Enabled  =   false ;
            
this .hlLast.Enabled  =   false ;
        }

        GridView1.DataSource 
=  ds.Tables[ 0 ];
        GridView1.DataBind();
    }
复制代码

 

 

转载于:https://www.cnblogs.com/hfzsjz/p/3178455.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值