Asp.net 高性能数据分页函数,调用示例

ms sql存储过程


--  =============================================
--
 Create date: <2006-11-05>
--
 Description:    <高效分页存储过程,仅适用于Sql2005>
--
 Notes:        <排序字段强烈建议建索引>
--
 =============================================
create   Procedure   [ dbo ] . [ Page ]  
 
@TableName   varchar ( 50 ),         -- 表名
  @Fields   varchar ( 1000 =   ' * ' ,     -- 字段名(全部字段为*)
  @OrderField   varchar ( 1000 ),         -- 排序字段(必须!支持多字段)
  @sqlWhere   varchar ( 1000 =   Null , -- 条件语句(不用加where)
  @pageSize   int ,                     -- 每页多少条记录
  @pageIndex   int   =   1  ,             -- 指定当前为第几页
  @TotalPage   int  output             -- 返回总页数
as
begin

    
Begin   Tran   -- 开始事务

    
Declare   @sql   nvarchar ( 4000 );
    
Declare   @totalRecord   int ;    

    
-- 计算总记录数
         
    
if  ( @SqlWhere = ''   or   @sqlWhere = NULL )
        
set   @sql   =   ' select @totalRecord = count(*) from  '   +   @TableName
    
else
        
set   @sql   =   ' select @totalRecord = count(*) from  '   +   @TableName   +   '  where  '   +   @sqlWhere

    
EXEC  sp_executesql  @sql ,N ' @totalRecord int OUTPUT ' , @totalRecord  OUTPUT -- 计算总记录数       
    
    
-- 计算总数量
     select   @TotalPage = @totalRecord -- CEILING((@totalRecord+0.0)/@PageSize)+1

    
if  ( @SqlWhere = ''   or   @sqlWhere = NULL )
        
set   @sql   =   ' Select * FROM (select ROW_NUMBER() Over(order by  '   +   @OrderField   +   ' ) as rowId, '   +   @Fields   +   '  from  '   +   @TableName  
    
else
        
set   @sql   =   ' Select * FROM (select ROW_NUMBER() Over(order by  '   +   @OrderField   +   ' ) as rowId, '   +   @Fields   +   '  from  '   +   @TableName   +   '  where  '   +   @SqlWhere     
        
    
    
-- 处理页数超出范围情况
     if   @PageIndex <= 0  
        
Set   @pageIndex   =   1
    
    
if   @pageIndex > @TotalPage
        
Set   @pageIndex   =   @TotalPage

     
-- 处理开始点和结束点
     Declare   @StartRecord   int
    
Declare   @EndRecord   int
    
    
set   @StartRecord   =  ( @pageIndex - 1 ) * @PageSize   +   1
    
set   @EndRecord   =   @StartRecord   +   @pageSize   -   1

    
-- 继续合成sql语句
     set   @Sql   =   @Sql   +   ' ) as  '   +   @TableName   +   '  where rowId between  '   +   Convert ( varchar ( 50 ), @StartRecord +   '  and  '   +    Convert ( varchar ( 50 ), @EndRecord )
    
-- print @Sql
     Exec ( @Sql )

--     print @totalRecord 
     If   @@Error   <>   0
      
Begin
        
RollBack   Tran
        
Return   - 1
      
End
     
Else
      
Begin
        
Commit   Tran
        
-- print @totalRecord 
         Return   @totalRecord   -- -返回记录总数
        
        
      
End    
    
end

asp.net分页函数



  #region  获取分页的数据
        
///   <summary>
        
///  获取分页的数据
        
///   </summary>
        
///   <param name="TblName"> 数据表名 </param>
        
///   <param name="Fields"> 要读取的字段 </param>
        
///   <param name="OrderField"> 排序字段 </param>
        
///   <param name="SqlWhere"> 查询条件 </param>
        
///   <param name="PageSize"> 每页显示多少条数据 </param>
        
///   <param name="pageIndex"> 当前页码 </param>
        
///   <param name="TotalPage"> 返回值,共有多少页 </param>
        
///   <returns></returns>

        
public   static  DataSet PageData( string  TblName,  string  Fields,  string  OrderField,  string  SqlWhere,  int  PageSize,  int  pageIndex,  out   int  TotalPage)
        {
           
            TotalPage 
=   1 ;
            DbObject db 
=   new  DbObject();

            
string  connString  =  db.ConnectionString;

            SqlConnection conn 
=   new  SqlConnection(connString);
            SqlCommand comm 
=   new  SqlCommand( " Page " , conn);

            comm.Parameters.Add(
new  SqlParameter( " @TableName " , SqlDbType.NVarChar,  100 ));
            comm.Parameters[
0 ].Value  =  TblName;

            comm.Parameters.Add(
new  SqlParameter( " @Fields " , SqlDbType.NVarChar,  1000 ));
            comm.Parameters[
1 ].Value  =  Fields;

            comm.Parameters.Add(
new  SqlParameter( " @OrderField " , SqlDbType.NVarChar,  1000 ));
            comm.Parameters[
2 ].Value  =  OrderField;

            comm.Parameters.Add(
new  SqlParameter( " @sqlWhere " , SqlDbType.NVarChar,  1000 ));
            comm.Parameters[
3 ].Value  =  SqlWhere;

            comm.Parameters.Add(
new  SqlParameter( " @pageSize " , SqlDbType.Int));
            comm.Parameters[
4 ].Value  =  PageSize;

            comm.Parameters.Add(
new  SqlParameter( " @pageIndex " , SqlDbType.Int));
            comm.Parameters[
5 ].Value  =  pageIndex;


            comm.Parameters.Add(
new  SqlParameter( " @TotalPage " , SqlDbType.Int));
            comm.Parameters[
6 ].Direction  =  ParameterDirection.Output;


            comm.CommandType 
=  CommandType.StoredProcedure;
            SqlDataAdapter dataAdapter 
=   new  SqlDataAdapter(comm);
            DataSet ds 
=   new  DataSet();
            dataAdapter.Fill(ds);
            TotalPage 
=  ( int )comm.Parameters[ 6 ].Value;           

            conn.Close();
            conn.Dispose();
            comm.Dispose();
            db.Dispose();
            
return  ds;
        }
        
#endregion

 

 分页代码显示


  #region  分页代码显示
        
///   <summary>
        
///  分页代码显示
        
///   </summary>
        
///   <param name="Url"> 跳转地址 </param>
        
///   <param name="TotleNum"> 总数据量 </param>
        
///   <param name="NumPerPage"> 每页显示多少条 </param>
        
///   <param name="Thepage"></param>
        
///   <param name="ShowJump"> 是否显示跳转按钮 </param>
        
///   <param name="pagestyle"> 显示风格 </param>
        
///   <returns></returns>
         public   static   string  PageStr( string  Url,  int  TotleNum,  int  NumPerPage,  int  Thepage,  bool  ShowJump,  int  pagestyle)
        {
            
string  strTemp;
            
int  n;
            
int  p;
            
int  ii;
            
if  (Convert.ToInt32(TotleNum)  <=  Convert.ToInt32(NumPerPage))
                
return   "" ;
            Url 
=  Url.Trim();
            
if  (Url  !=   "" )
                Url 
+=   " & " ;

            
if  (Convert.ToInt32(TotleNum)  %  Convert.ToInt32(NumPerPage)  ==   0 )
            {
                n 
=  TotleNum  /  NumPerPage;
            }
            
else
            {
                n 
=  TotleNum  /  NumPerPage  +   1 ;
            }
            strTemp 
=   " <table align=center  width=\ " 100 % \ " ><tr><td align=\ " center\ " > " ;

            strTemp 
+=   " 共  "   +  TotleNum  +   "  条记录 页次: "   +  Thepage  +   " / "   +  n  +   " 页  " ;
            strTemp 
+=  NumPerPage  +   " 条/页  " ;

            
if  (Convert.ToInt32(pagestyle)  ==   1 )
            {
                
if  (Convert.ToInt32(Thepage)  <   2 )
                    strTemp 
+=   " <font color=\ " # 999999 \ " >首页 上页</font>  " ;
                
else
                {
                    strTemp 
+=   " <a href=? "   +  Url  +   " page=1  class=\ " link\ " >首页</a>  " ;
                    strTemp 
+=   " <a href=? "   +  Url  +   " page= "   +  (Thepage  -   1 +   "   class=\ " link\ " >上页</a>  " ; ;
                }
                
if  (n  -  Convert.ToInt32(Thepage)  <   1 )
                {
                    strTemp 
+=   " <font color=\ " # 999999 \ " >下页 尾页</font>  " ;
                }
                
else
                {
                    strTemp 
+=   " <a href=? "   +  Url  +   " page= "   +  (Thepage  +   1 +   "   class=\ " link\ " >下页</a>  " ;
                    strTemp 
+=   " <a href=? "   +  Url  +   " page= "   +  n  +   "   class=\ " link\ " >尾页</a>   " ;
                }
            }
            
if  (Convert.ToInt32(pagestyle)  ==   2 )
            {
                
if  (Convert.ToInt32(Thepage)  -   1   %   10   ==   0 )
                    p 
=  (Thepage  -   1 /   10 ;
                
else
                    p 
=  (Thepage  -   1 /   10 ;

                
if  (p  *   10   >   0 )
                    strTemp 
+=   " <a href=? "   +  Url  +   " page= "   +  p  *   10   +   "  title=上十页 >[&lt;&lt;]</a>    " ;
                
int  uming_i  =   1 ;
                
for  (ii  =  p  *   10   +   1 ; ii  <=  p  *   10   +   10 ; ii ++ )
                {
                    
if  (ii  ==  Thepage)
                        strTemp 
+=   " <strong><font color=#ff0000>[ "   +  ii  +   " ]</font></strong>  " ;
                    
else
                        strTemp 
+=   " <a href=? "   +  Url  +   " page= "   +  ii  +   " >[ "   +  ii  +   " ]</a>  " ;
                    
if  (ii  ==  n)
                        
break ;
                    uming_i 
=  uming_i  +   1 ;
                }
                
if  (ii  <=  n  &&  uming_i  ==   11 )
                    strTemp 
+=   " <a href=? "   +  Url  +   " page= "   +  ii  +   "  title=下十页>[&gt;&gt;]</a>   " ;
            }

            
if  (ShowJump)
            {
                
string  guid  =  CreateCard(Guid.NewGuid().ToString());
                strTemp 
+=   " &nbsp;&nbsp;<script>function  "   +  guid  +   " _a(){var  "   +  guid  +   " _b=document.getElementById(\ ""  + guid +  " _i\ " ).value;var url=? " +  Url  + " &page=+  " +  guid  + " _b +;this.location.href=+ url +;}</script>转到:<input type=\ " text\ "  name=\ ""  + guid +  " _i\ "  id=\ ""  + guid +  " _i\ "  style=\ " width:20px;height:15px;\ "  /> 页&nbsp; <input name=\ " pagebutton\ "  type=\ " button\ "  value=\ " 跳转\ "  onclick=\ " return   "  + guid +  " _a();\ "  /> " ;
            }
            strTemp 
+=   " </td></tr></table> " ;
            
return  ( string )strTemp;
        }
        
#endregion

 

   
#region  显示页面输入框
        
///   <summary>
        
///  显示页面输入框
        
///   </summary>
        
///   <param name="str"></param>
        
///   <returns></returns>
         private   static   string  CreateCard( string  str)
        {
            
string  card  =  str;
            
for  ( int  i  =   0 ; i  <=   9 ; i ++ )
            {
                card 
=  card.Replace(i.ToString(),  "" ).Replace( " - " "" ).ToUpper();

            }         

            
return  card;


        }
        
#endregion

 

 分页调用示例 


  #region  分页
            
string  TblName  =  tbl;
            
string  Fields  =   " id,gxmc,zymc,wc,fs,pc,bwlqrs,bzylqrs,bzyzgf,zgfwc,bzyzdf,zdfwc,pjf,cs,xnwc,pro " ; // 读取的字段
             string  OrderField  =   "  fs desc " ; // 排序
             string  SqlWhere  =   "" ; // 条件
             if  ( ! string .IsNullOrEmpty(pc))
            {
                SqlWhere 
=   "  pc in( "   +  pc  +   " ) " ;
            }

            
int  PageSize  =   20 // 分页大小
             int  totalpage  =   0 ;
            
int  pageIndex;
            
string  _page  =   " 1 " ;
            _page 
=  Convert.ToString(Request.QueryString[ " page " ]);
            
if  ( string .IsNullOrEmpty(_page))
            {
                _page 
=   " 1 " ;
            }
            
else
            {
                _page 
=  Fun.FilterSQL(_page);
            }
            
if  (_page  ==   " 0 " )
            {
                _page 
=   " 1 " ;
            }
            pageIndex 
=  Convert.ToInt32(_page);
            
string  pagestr =   "" ;
            DataSet ds 
=  GetPage.PageData(TblName, Fields, OrderField, SqlWhere, PageSize, pageIndex,  out  totalpage, conn2);
            
for  ( int  i  =   0 ; i  <  ds.Tables[ 0 ].Rows.Count; i ++ )
            {
                
string  TR  =   "  onmouseover=\ " this .style.background = #FFF9E8;\ "  onmouseout=\ " this .style.background = #FFFFFF;\ "" ;

                
if  (i  %   2   ==   0 )
                {

                    TR 
=   "  class=\ " alter\ "  onmouseover=\ " this .style.background = #FFF9E8;\ "  onmouseout=\ " this .style.background = #EBF3FD;\ "" ;
                }

                pagestr 
+=   " <tr  "   +  TR  +   " ><td> <input name=\ " id\ "  value=\ ""  + ds.Tables[0].Rows[i][ " id " ].ToString() +  " \ "  type=\ " checkbox\ "  /></td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " gxmc " ].ToString()  +   " </td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " zymc " ].ToString()  +   " </td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " fs " ].ToString()  +   " </td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " wc " ].ToString()  +   " </td><td class=\ " gray\ "  align=\ " center\ " > "   +  setxnwc(ds.Tables[ 0 ].Rows[i][ " xnwc " ].ToString(), ds.Tables[ 0 ].Rows[i][ " wc " ].ToString(), ds.Tables[ 0 ].Rows[i][ " pc " ].ToString())  +   " </td><td>&nbsp; "   +  setpc(ds.Tables[ 0 ].Rows[i][ " pc " ].ToString())  +   " </td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " bwlqrs " ].ToString()  +   " </td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " bzylqrs " ].ToString()  +   " </td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " bzyzgf " ].ToString()  +   " </td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " zgfwc " ].ToString()  +   " </td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " bzyzdf " ].ToString()  +   " </td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " zdfwc " ].ToString()  +   " </td><td> "   +  ds.Tables[ 0 ].Rows[i][ " pjf " ].ToString()  +   " </td> "   +  GetTblName(tbl,  " <td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " pro " ].ToString()  +   " </td><td>&nbsp; "   +  ds.Tables[ 0 ].Rows[i][ " cs " ].ToString()  +   " </td> " +   " <td><a href=\ " #\ "  onclick=\ " Confirm1(真的要修改吗 ? ,wj_add.aspx,id = "  + ds.Tables[0].Rows[i][ " id " ].ToString() +  " ); return   false ;\ " >修改</a></td><td><a href=\ " #\ "  onclick=\ " Confirm(真的要删除吗 ? ,id = "  + ds.Tables[0].Rows[i][ " id " ].ToString() +  " & act = del); return   false ;\ " >删除</a></td></tr> " ;
            }
            ds.Clear();
            ds.Dispose();
          Page_list.Text 
=  pagestr;  // 绑定分页数据

            
this .PageStr.Text  =  GetPage.PageStr( " tbl= "   +  tbl  +   " &title= "   +  title  +   " &subtitle= "   +  subtitle  +   " &pc= "   +  pc, totalpage, PageSize, pageIndex,  true 2 ); // 绑定分页导航
             #endregion

 

你可能感兴趣的:(asp.net)