public void bangding()
    {
        string sql = "select * from room where id=5 order by update desc/*没加条件前程序可以执行,加上后则报错*/";   
        //以下是参数,有两个是靠AspNetPager1传给par的   
        //真正的参数只有sql,也正是用户所用到的查询字符串  
        SqlParameter[] par = new SqlParameter[3];   
        par[0] = new SqlParameter("@sql", SqlDbType.VarChar);   
        par[0].Value=sql;   
        par[1] = new SqlParameter("@indexpage", SqlDbType.Int);   
        par[1].Value = this.AspNetPager1.CurrentPageIndex;   
        par[2] = new SqlParameter("@pagesize", SqlDbType.Int);   
        par[2].Value = this.AspNetPager1.PageSize;   
        DataSet Ds = SqlHelper.ExecuteDataset(SqlHelper.CONNECTION_STRING, CommandType.StoredProcedure, "Pr_jxytest3",par);   
  
       //绑定的地方Tables[2]是记录集   
        //Tables[1]是记录信息   
        this.GridView1.DataSource = Ds.Tables[2];   
       this.GridView1.DataBind();   
        //下面这一句是为分页控件付总的记录条数   
        this.AspNetPager1.RecordCount =Convert.ToInt32(Ds.Tables[1].Rows[0][1]);  
    } 上面的分页程序在没加上条件的情况下可以用,但如果加上条件后则执行错误.
存贮过程:
Create procedure jxytext_pagination
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as TotalPages,@rowcount as TotalRows,@currentpage as CurPage 
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
exec sp_cursorclose @P1
set nocount off
GO
create procedure Pr_jxytest3
(
@sql varchar(1000) ,
@indexpage int,
@pagesize int
)
AS
begin
exec jxytext_pagination @sql,@indexpage,@pagesize
end
GO

解决方案 »

  1.   


    Create Procedure [dbo].[FramWorkPage] 
     @TableName varchar(50),        --表名
     @Fields varchar(5000) = '*',    --字段名(全部字段为*)
     @OrderField varchar(5000),        --排序字段(必须!支持多字段)
     @sqlWhere varchar(5000) = Null,--条件语句(不用加where)
     @pageSize int,                    --每页多少条记录
     @pageIndex int = 1 ,            --指定当前为第几页
     @TotalPage int output,            --返回条数 
    @OrderType bit             -- 设置排序类型,1 升序  0 值则降序
    as
    begin
    declare @strOrder varchar(400) -- 排序类型

        Begin Tran --开始事务
        Declare @sql nvarchar(4000);
        Declare @totalRecord int;    
        --计算总记录数    
        if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is 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) if @OrderType = 0
    begin
    set @strOrder = ' order by [' + @OrderField +'] desc'
    --如果@OrderType是0,就执行降序,这句很重要!
    end
    else
    begin
    set @strOrder = ' order by [' + @OrderField +'] asc'
    end
       
        if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL)
            set @sql = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName 
        else
            set @sql = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) 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 if @OrderType = 0
    begin
    set @strOrder = ' order by rowid asc'
    --如果@OrderType是0,就执行降序,这句很重要!
    end
    else
    begin
    set @strOrder = ' order by rowid desc'
    end
        --继续合成sql语句
        set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord) + ' '+@strOrder
       --   print @sql
     Exec(@Sql)
        ---------------------------------------------------
        If @@Error <> 0
          Begin
            RollBack Tran
            Return -1
          End
         Else
          Begin
            Commit Tran
            Return @totalRecord ---返回记录总数
          End    
    end
    没去看你的,直接给你一个得了,你那个用游标,数据量大了不知道你怎么办
      

  2.   


    那个存储过程是我找的一个例子,号称千万级的数据也很快...
    地址:http://blog.csdn.net/hongsejiaozhu/archive/2008/06/16/2552604.aspx问题是在SQL语句里加上条件就会出错.
    string sql = "select * from room where id=5 order by update desc/*没加条件前程序可以执行,加上后则报错*/";   
      

  3.   

    列名没有错的.只写order by update desc也会错,如下:
    在关键字 'order' 附近有语法错误。
    游标未声明。
    sp_cursorfetch: 所提供的游标标识符值(0)无效。
    sp_cursorclose: 所提供的游标标识符值(0)无效。
      

  4.   

    如果where后面只跟order by update desc会报:在关键字 'order' 附近有语法错误。 
    游标未声明。 
    sp_cursorfetch: 所提供的游标标识符值(0)无效。 
    sp_cursorclose: 所提供的游标标识符值(0)无效。
    如果where后设string的条件(如:where name=joy)会报:列名 'joy' 无效。
    游标未声明。
    sp_cursorfetch: 所提供的游标标识符值(0)无效。
    sp_cursorclose: 所提供的游标标识符值(0)无效。