CREATE   PROCEDURE   GetPage   
          @tblName             varchar(255),               --   表名   
          @fldName             varchar(255),               --   字段名   
          @PageSize           int   =   10,                       --   页尺寸   
          @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)   
  GO   <%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.SqlClient" %>
<script runat="server">    protected void Page_Load(Object sender, EventArgs e)
         {
             int intPageNo,intPageSize,intPageCount;
             intPageSize = 25;
             if (Request["CurrentPage"]==null) 
                 {
                     intPageNo = 1;
                 }
             else
                 {
                     intPageNo = Int32.Parse(Request["CurrentPage"]);
                 }
             
             
             SqlConnection mySqlConnection = new SqlConnection("server=(local);Database=test;user id=sa;password=");
             SqlCommand mySqlCommand = new SqlCommand("up_GetTopicList", mySqlConnection);
             mySqlCommand.CommandType = CommandType.StoredProcedure;
             
             SqlParameter workParm;
             
             //搜索表字段,以","号分隔
             workParm = mySqlCommand.Parameters.Add("@a_TableList", SqlDbType.VarChar, 200);
             mySqlCommand.Parameters["@a_TableList"].Value = "OFFERID,type,offertime";
             
             //搜索表名
             workParm = mySqlCommand.Parameters.Add("@a_TableName", SqlDbType.VarChar, 30);
             mySqlCommand.Parameters["@a_TableName"].Value = "offer"; 
             
             //搜索条件,如"select * from aa where a=1 and b=2 and c=3"则条件为"where a=1 and b=2 and c=3"
             workParm = mySqlCommand.Parameters.Add("@a_SelectWhere", SqlDbType.VarChar, 500);
             mySqlCommand.Parameters["@a_SelectWhere"].Value = "where type='idl'"; 
             
             //表主键字段名,必须为INT类型
             workParm = mySqlCommand.Parameters.Add("@a_SelectOrderId", SqlDbType.VarChar, 50);
             mySqlCommand.Parameters["@a_SelectOrderId"].Value = "offerid";       
             
             //排序,可以使用多字段排序但主键字段必需在最前面
             workParm = mySqlCommand.Parameters.Add("@a_SelectOrder", SqlDbType.VarChar, 50);
             mySqlCommand.Parameters["@a_SelectOrder"].Value = "order by offerid desc"; 
             
             //页号
             workParm = mySqlCommand.Parameters.Add("@a_intPageNo", SqlDbType.Int);
             mySqlCommand.Parameters["@a_intPageNo"].Value = intPageNo; 
             
             //每页显示数
             workParm = mySqlCommand.Parameters.Add("@a_intPageSize", SqlDbType.Int);
             mySqlCommand.Parameters["@a_intPageSize"].Value = intPageSize; 
             
             //总记录数(存储过程输出参数)
             workParm = mySqlCommand.Parameters.Add("@RecordCount", SqlDbType.Int);
             workParm.Direction = ParameterDirection.Output;             
             
             //当前页记录数(存储过程返回值)
             workParm = mySqlCommand.Parameters.Add("RowCount", SqlDbType.Int);
             workParm.Direction = ParameterDirection.ReturnValue;             mySqlConnection.Open();
             Repeater.DataSource = mySqlCommand.ExecuteReader();                                   
             
             Repeater.DataBind();
             
             mySqlConnection.Close();
             
             Int32 RecordCount = (Int32)mySqlCommand.Parameters["@RecordCount"].Value;
             Int32 RowCount = (Int32)mySqlCommand.Parameters["RowCount"].Value;
             
             LabelRecord.Text = RecordCount.ToString();
             LabelRow.Text = intPageNo.ToString();
             intPageCount = RecordCount/intPageSize;
             if ((RecordCount%intPageSize)>0)
                 intPageCount += 1;
             LabelPage.Text = intPageCount.ToString();
             
             if (intPageNo>1)
                 {
                     HLFistPage.NavigateUrl = "select.aspx?CurrentPage=1";
                     HLPrevPage.NavigateUrl = String.Concat("select.aspx?CurrentPage=","",intPageNo-1);
                 }
             else
                 {
                     HLFistPage.NavigateUrl = "";
                     HLPrevPage.NavigateUrl = "";
                     //HLFistPage.Enabled = false;
                     //HLPrevPage.Enabled = false;
                 }
                 
             if (intPageNo<intPageCount)
                 {
                     HLNextPage.NavigateUrl = String.Concat("select.aspx?CurrentPage=","",intPageNo+1);
                     HLEndPage.NavigateUrl = String.Concat("select.aspx?CurrentPage=","",intPageCount);
                 }
             else
                 {
                     HLNextPage.NavigateUrl = "";
                     HLEndPage.NavigateUrl = "";
                     //HLNextPage.Enabled=false;
                     //HLEndPage.Enabled=false;
                 }
             
         }</script>

解决方案 »

  1.   

    create PROCEDURE dbo.GetPagingRecord 
        ( 
            @tablename varchar(100),--表名或视图表 
            @fieldlist varchar(4000)='*',--欲选择字段列表 
            @orderfield varchar(100),--排序字段 
            @keyfield varchar(100),--主键 
            @pageindex int,--页号,从0开始 
            @pagesize int=20,--页尺寸 
            @strwhere varchar(4000),--条件 
            @ordertype bit=1--排序,1,降序,0,升序 
        ) 
    AS 
    /**//* 
    名称:GetPagingRecord 
    作用:按任意字段进行排序分页 
    作者:菩提树(MARK MA) 
    时间:2004-12-14 
    声明:此代码你可以无偿使用及转载,但在转载时,请勿移称本文字声明 
    */ 
        SET NOCOUNT ON 
        declare @sqlstr varchar(6000) 
        --处理SQL中危险字符,并且将条件处理成易嵌入的形式 
        set @strwhere=replace(@strwhere,'''','''''') 
        set @strwhere=replace(@strwhere,'--','') 
        set @strwhere=replace(@strwhere,';','') 
        set @sqlstr='declare @CurPageNum int;' 
        set @sqlstr=@sqlstr+'declare @nextpagenum int;' 
        set @sqlstr=@sqlstr+'set @curpagenum='+cast(@PageIndex as varchar)+'*'+cast(@Pagesize as varchar)+';' 
        set @sqlstr=@sqlstr+'set @nextpagenum='+cast(@PageIndex+1 as varchar)+'*'+cast(@Pagesize as varchar)+';' 
        set @sqlstr=@sqlstr+'declare @sqlstr varchar(6000);' 
        if @ordertype=1 
        begin 
        set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast(@nextpagenum as varchar)+'' * from  
     
    '+@tablename+'  where '+@strwhere+' order by '+@orderfield+' desc ) as a where '+@keyfield+' not in (  
     
    select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where '+@strwhere+'  
     
    order by '+@orderfield+' desc) order by '+@orderfield+' desc'';' 
        end 
        else 
        begin 
        set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast(@nextpagenum as varchar)+'' * from  
     
    '+@tablename+'  where '+@strwhere+' order by '+@orderfield+' asc ) as a where '+@keyfield+' not in (  
     
    select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where '+@strwhere+'  
     
    order by '+@orderfield+' asc) order by '+@orderfield+' asc'';' 
        end 
        set @sqlstr=@sqlstr+'execute( @sqlstr)' 
        --print @sqlstr 
        execute(@sqlstr)