asp.net 自定义分页
请问 gridview 能实现自定义分页吗? (比默认的效率好)
如果可以,请把代码放出来,让我学习一下.先谢谢了!
如果不行,可以把其他方法的自定义分页代码放出来吗?比如储存过程分页
感激不尽!
[解决办法]
储存过程分页
create proc Sp_PageSize
@PageSize int, --当前要显示的页
@PageSizeCount int , --每页的记录条数
@UserstrSql NVARCHAR(2000), --查询SQL语句
@AllPageSize int out, --总的页数
@PageSizeAllCount int out --总的@UserstrSql总记录数
as
declare @CurrentFistItem int --当前页的首记录ident(自增的量)
declare @pageitemcount int --每页的最后一个记录templ
declare @strSql NVARCHAR(2000) --中间@UserstrSql
begin
set @strSql = REPLACE(@UserstrSql, 'from ', ',IDENTITY(INT, 1, 1) as templ into TemplTable from ')
set @strSql=@strSql
EXECUTE sp_executesql @strSql --形成要查找的数据
select @PageSizeAllCount=max(templ) from TemplTable --求出@UserstrSql总记录数
--计算总页数
if(@PageSizeAllCount % @PageSizeCount != 0)
begin
set @AllPageSize = @PageSizeAllCount / @PageSizeCount+1
end
else
begin
set @AllPageSize = @PageSizeAllCount / @PageSizeCount
end
if(@PageSize > @AllPageSize)
begin
set @PageSize = @AllPageSize
end
else if(@PageSize <= 0)
begin
set @PageSize = 1
end
set @CurrentFistItem = @PageSize * @PageSizeCount - @PageSizeCount + 1
set @pageitemcount = @CurrentFistItem + @PageSizeCount - 1
set @strSql = 'select * from TemplTable ' + ' where templ > = ' + CAST(@CurrentFistItem as NVARCHAR(50)) + ' and templ <= ' + CAST(@pageitemcount as NVARCHAR(50))
EXECUTE sp_executesql @strSql
drop table TemplTable
end
GO
-------- 调用示例 ----------
declare @AllPage int
declare @AllNum int
exec Sp_PageSize 5, 10, 'select content,difficult from e_Subject ', @AllPage, @AllNum
[解决办法]
这个是我改过的一个无错的 本人测试没有问题
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[sp_page]
@strTable varchar(50), --表名
@strColumn varchar(50), --按该列来进行分页
@intColType int, --@strColumn列的类型,0-数字类型,1-字符类型,2-日期时间类型
@intOrder bit, --排序,0-顺序,1-倒序
@strColumnlist varchar(800), --要查询出的字段列表,*表示全部字段
@intPageSize int, --每页记录数
@intPageNum int, --指定页
@strWhere varchar(800), --查询条件
@intPageCount int OUTPUT --总页数
AS
DECLARE @sql nvarchar(4000) --用于构造SQL语句
DECLARE @where1 varchar(800) --构造条件语句
DECLARE @where2 varchar(800) --构造条件语句
IF @strWhere is null or rtrim(@strWhere)= ' '
-- 为了避免SQL关键字与字段、表名等连在一起,首先为传入的变量添加空格
BEGIN --没有查询条件
SET @where1= ' WHERE '
SET @where2= ' '
END
ELSE
BEGIN --有查询条件
SET @where1= ' WHERE ( '+@strWhere+ ') AND '
SET @where2= ' WHERE ( '+@strWhere+ ') '
END
set @strColumn = ' ' + @strColumn + ' '
set @strColumnlist = ' ' + @strColumnlist + ' '
--构造SQL语句,计算总页数。计算公式为 总页数 = Ceiling ( 记录个数 / 页大小 )
SET @sql= 'SELECT @intPageCount=CEILING((COUNT(*)+0.0)/ '
+ CAST(@intPageSize AS varchar)
+ ') FROM ' + @strTable + @where2
--执行SQL语句,计算总页数,并将其放入@intPageCount变量中
EXEC sp_executesql @sql,N '@intPageCount int OUTPUT ',@intPageCount OUTPUT
--将总页数放到查询返回记录集的第一个字段前,此语句可省略
--SET @strColumnlist= Cast(@intPageCount as varchar(30)) + ' ' + @strColumnlist
IF @intOrder=0 --构造升序的SQL
BEGIN
SET @sql= 'SELECT TOP '+ CAST(@intPageSize AS varchar) +
@strColumnlist +
' FROM ' + @strTable + @where1 +
@strColumn + '> (SELECT MAX( '+@strColumn+ ') '+
' FROM (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1) AS varchar) +
@strColumn + ' FROM '+ @strTable+@where2+ 'ORDER BY '+@strColumn+ ') t) ORDER BY '+ @strColumn
END
ELSE --构造降序的SQL
BEGIN
SET @sql= 'SELECT TOP '+ CAST(@intPageSize AS varchar) +
@strColumnlist+
' FROM '+ @strTable + @where1 +
@strColumn + ' <(SELECT MIN( '+@strColumn+ ') '+
' FROM (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1) AS varchar) +
@strColumn + ' FROM '+ @strTable+@where2+ 'ORDER BY '+@strColumn+ ' DESC) t) ORDER BY '+
@strColumn + ' DESC '
END
IF @intPageNum=1--第一页
BEGIN
SET @sql= 'SELECT TOP '+CAST(@intPageSize AS varchar) + @strColumnlist + ' FROM '+@strTable+
@where2+ 'ORDER BY '+@strColumn
IF @intOrder=0
SET @sql=@sql+ ' '
ELSE
SET @sql=@sql+ ' DESC '
END
EXEC(@sql)
GO