我在写一个系统,这个系统里用到大量的查询,都需要分页,我在网上找了一些,很多都是要写存储过程,如果我有200个GridView需要分页,那我就要写200个存储过程,这样也太烦人了。
谁能告诉我一个比较高效并且不需要写太多的存储过程的[通用分页类]啊??
谢谢各位了!

解决方案 »

  1.   

    这要看你的工程要求了,总的来说还是用存储过程。
    根据需求写几个,不是200个。就是参数化你的不一样的地方。
    比如SQL文,可以使一个存储过程的参数。
    GridView第几页是你的参数。
    查询几条数据是你的参数。那么这样就可以把这个存储过程共通化了~~
      

  2.   


    可以给个具体的解决方案吗?我大概有100来个页面用到GridView需要分页,请问该在吗实现?
      

  3.   

    几乎就帮你写好了,逻辑就是如此了~~
    细节自己补上--@m_SQL = select Table.* from Table
    CREATE PROCEDURE [dbo].[SP_Query]
        @PageSize             int,
        @PageIndex            int,
        @m_SQL                varchar(8000)
    AS
    BEGIN
            DECLARE @MinTop AS int
    DECLARE @MaxTop AS int

    SELECT @MinTop = @PageSize*@PageIndex
    SELECT @MaxTop = @PageSize*(@PageIndex+1)

    select @m_SQL = @m_SQL + 'where p.PID>@MinTop and p.PID<@MaxTop'
            EXEC(@m_SQL)
    END
      

  4.   

    应用数据库分页啊:oracle有个什么column_num,你查查,其他的好像都有!
      

  5.   

    只要写一个存储过程就好。。
    可以控制参数、。、也就是传来的值。。如果实现搞不懂。。
    就加一个TYPEID 根据传来的ID值 来判断执行哪条语句。
      

  6.   

    如果你这样想,有多少个GridView就要写多少个存储过程来分页,那程序员可以不必混了
    实际上一个数据库一般只需要一个分页存储过程就可以,再配合吴旗娃的分页控件就非常好用。
    下面给你一个分页存储过程,SQL适用:-- =============================================
    -- 作者:        <Jason>
    -- 创建时间: <2007-9-05>
    -- 描述:    <高效分页存储过程,仅适用于Sql2005>
    -- Notes:        <排序字段强烈建议建索引>
    -- =============================================
    Create Procedure [dbo].[DataPage] 
     @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 desc'
    --如果@OrderType是0,就执行降序,这句很重要!
    end
    else
    begin
    set @strOrder = ' order by rowid asc'
    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
      

  7.   

    网上很多的,在SQL板块里很多很好的,直接调用就行了,管他多与不多的
      

  8.   

    在来一个吧,绝对通用的,效率客观................CREATE PROCEDURE GetRecordFromPage
    @tblName varchar(255), -- 表名
    @fldName varchar(255), -- 字段名
    @PageSize int = 10, -- 页尺寸
    @PageIndex int = 1, -- 页码
    @IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
    @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
    @strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
    ASdeclare @strSQL varchar(2000) -- 主语句
    declare @strTmp varchar(1000) -- 临时变量
    declare @strOrder varchar(1000) -- 排序类型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"
    endset @strSQL = "select top " + str(@PageSize) + " * from ["
    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
    + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
    + @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
    + @strOrderif @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 + ") " + @strOrderif @PageIndex = 1
    begin
    set @strTmp = ""
    if @strWhere != ''
    set @strTmp = " where (" + @strWhere + ")"set @strSQL = "select top " + str(@PageSize) + " * from ["
    + @tblName + "]" + @strTmp + " " + @strOrder
    endif @IsCount != 0
    set @strSQL = "select count(*) as Total from [" + @tblName + "]"exec (@strSQL)
    GO
      

  9.   

    怎么取这个值Return @totalRecord ---返回记录总数
      

  10.   

    网上很多,都是拼SQL语句的,写一个就行了
      

  11.   

    国外的分页代码-- ???????????
    -- ???????????
    -- ???????????
    -- ???????????
    --region [dbo].[pro_Alarm_Type_SelectPagedDynamic]------------------------------------------------------------------------------------------------------------------------
    -- Generated By:   Administrator using CodeSmith 4.0.0.0
    -- Template:       StoredProcedures.cst
    -- Procedure Name: [dbo].[pro_Alarm_Type_SelectPagedDynamic]
    -- Date Generated: 2009年4月13日
    ------------------------------------------------------------------------------------------------------------------------CREATE PROCEDURE [dbo].[pro_Alarm_Type_SelectPagedDynamic]
    @PageSize int, --页面大小
    @PageIndex int, --第几页
    @WhereCondition nvarchar(500) = NULL,
    @OrderByExpression nvarchar(250) = NULL
    AS--SET NOCOUNT ON
    --SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    DECLARE @SQL nvarchar(3250)SET @SQL = '
    with TempTBL as (
    SELECT ROW_NUMBER() OVER (ORDER BY '
    IF @OrderByExpression IS NOT NULL AND LEN(@OrderByExpression) > 0
    BEGIN
    SET @SQL = @SQL + @OrderByExpression
    END
    Else
    Begin
    SET @SQL = @SQL + ' Alarm_TypeID '
    End
    SET @SQL = @SQL + ' )AS Row, * from [dbo].[Alarm_Type]'
    IF @WhereCondition IS NOT NULL AND LEN(@WhereCondition) > 0
    BEGIN
    SET @SQL = @SQL + ' Where ' + @WhereCondition
    End
    SET @SQL = @SQL +')
     SELECT * FROM TempTBL where Row between ' + Str((@PageIndex-1)*@PageSize+1) + ' and ' + Str((@PageIndex-1)*@PageSize+@PageSize) IF @OrderByExpression IS NOT NULL AND LEN(@OrderByExpression) > 0
    BEGIN
    SET @SQL = @SQL + '
     ORDER BY
    ' + @OrderByExpression
    END
    Else
    Begin
    SET @SQL = @SQL + ' ORDER BY  Alarm_TypeID '
    EndEXEC sp_executesql @SQL--select @SQL
    --endregionGO