首页 新闻 搜索 专区 学院

.net 分页,急急急!!!

0
[已关闭问题]

做一个模糊查询,比如有【性别,年龄范围,身高范围,地区等模糊查询条件】而查询条件可以选可以不选的情况,如果不加分页的存续过程,我就会写!想请教的是,如果家分页空间的存续过程应该怎么写呢?

数据库是SQL2000的

问题补充: CREATE procedure XH_QryEmployee @Flag int, @SEX varchar(10) , @UserNC varchar(100), @Province varchar(50), @city varchar(50), @Age1 int, @Age2 int, @height1 int, @height2 int, @cimg varchar(10), @startIndex int, @endIndex int AS SET if @Flag=1 begin declare @SQL varchar(1200) declare @indextable table(id int identity(1,1),nid int) set rowcount @endIndex set @SQL='' --set @SQL='select * from Emp_Employee where UserType=2' set @SQL='select UserID from Emp_Employee where usertype=2' If (@SEX !=null) set @SQL=@SQL+'and rtrim(SEX)= '''+ rtrim(@SEX) + '''' If (@Age1 !=null and @age2 !=null) set @SQL=@SQL+'and rtrim(age) between '''+ rtrim(@Age1) + ''' and '''+ rtrim(@Age2) + ''' ' if (@Province !=null)set @SQL=@SQL+'and rtrim(Province)= '''+ rtrim(@Province) + '''' if (@city !=null)set @SQL=@SQL+'and rtrim(city) like ''%'+ rtrim(@city) + '%''' If (@height1 !=null and @height2 !=null) set @SQL=@SQL+'and rtrim(height) between '''+ rtrim(@height1) + ''' and '''+ rtrim(@height2) + ''' ' If (@cimg !=null) set @SQL=@SQL+'and cimg is not null ' if (@UserNC !=null)set @SQL=@SQL+'and rtrim(UserNC) like ''%'+ rtrim(@UserNC) + '%''' set @SQL=@SQL+' order by Point desc' EXEC(@SQL) --insert into @indextable(nid) --select UserID from Emp_Employee where usertype=2 and UserName like '%'+@UserNC+'%' or RealName like '%'+@UserNC+'%' order by point desc select * from Emp_Employee O,@indextable t where O.UserID=t.nid and t.id between @startIndex and @endIndex order by t.id end if @Flag=2 declare @SQLStr varchar(1200) set @SQLStr='' set @SQLStr='select count(*) from Emp_Employee where UserType=2' If (@SEX !=null) set @SQLStr=@SQLStr+'and rtrim(SEX)= '''+ rtrim(@SEX) + '''' If (@Age1 !=null and @age2 !=null) set @SQLStr=@SQLStr+'and rtrim(age) between '''+ rtrim(@Age1) + ''' and '''+ rtrim(@Age2) + ''' ' if (@Province !=null) set @SQLStr=@SQLStr+'and rtrim(Province)= '''+ rtrim(@Province) + '''' if (@city !
Tiger2009的主页 Tiger2009 | 初学一级 | 园豆:181
提问于:2009-09-24 14:50
< >
分享
其他回答(3)
0

存储过程也支持分页啊,你只要为存储过程定义参数就可以了啊。

比如 表名、显示字段、条件、排序、每页数据行数,然后拼接sql 执行。下边是一个通用的例子


CREATE PROCEDURE sp_general_pagination
(
@psTblName varchar(1000) =null, -- 设置表名
@psStrGetFields varchar(400) ='*', -- 设置输出字段名
@psFieldName varchar(400) =null, -- 设置排序字段名(只能设1个字段,最好为字符串和数字型,其它类型字段会出错)
@psPageSize int =10, -- 设置分页尺寸,大于0
@psPageIndex int =1, -- 设置分页码,大于0
@psOrderType bit =0, -- 排序类型,非0值则降序
@psStrWhere varchar(8000) =null, -- 设置条件,不加where
@rsPageCount int =0 output, -- 输出页数
@rsRecordCount int =0 output, -- 输出记录数
@psFieldName2 varchar(32) =null -- 第二排序字段
)
as
Begin

Set nocount on

-- 参数合法检查
If (dbo.fu_isnull(@psTblName)=0 or
dbo.fu_isnull(
@psFieldName)=0 or
dbo.fu_isnull(
@psPageIndex)=0 or
dbo.fu_isnull(
@psPageSize)=0 or
@psPageIndex<=0 or
@psPageSize<=0)
Begin
return 0
End

-- 判断返回列名字段为空时设置为'*'
If (dbo.fu_isnull(@psStrGetFields)=0)
Begin
Set @psStrGetFields='*'
End

-- 定义参数
Declare @strNsql nvarchar(4000) -- 主语句
Declare @strSql varchar(8000) -- 主语句
Declare @strMax varchar(1000) -- 求Max()语句
Declare @strFlag varchar(20) -- 标致值'<','>'
Declare @strParams varchar(500) -- 参数值
Declare @strOrder varchar(500) -- 排序类型
Declare @strPageSize varchar(20) -- 页大小
Declare @strDropTbls varchar(100) -- 删除临时数

-- 计算总记录数(OUTPUT参数)
If (dbo.fu_isnull(@psStrWhere)=1)
Begin
Set @strNsql=' select @rsRecordCount=count(1) '+' from '+@psTblName+' where '+@psStrWhere
End
Else
Begin
Set @strNsql=' select @rsRecordCount=count(1) '+' from '+@psTblName
End

-- 执行SQL语句,求出总记录数
Exec sp_executesql @strNsql,N'@rsRecordCount int output',@rsRecordCount output
If @@error<>0
Begin
return 0
End

-- 判断Count('*')总数是否为0
If (@rsRecordCount<=0)
Begin
Set @rsPageCount=0
Exec ('select '+@psStrGetFields+' from '+@psTblName+' where 1=2')
If @@error<>0
Begin
return 0
End
Else
Begin
return 1
End
End
Else
Begin
-- 计算总页数(output参数)
Set @rsPageCount=ceiling(@rsRecordCount*1.0/@psPageSize)
End

-- 把页大小转换为字符串
Set @strPageSize=str(@psPageSize)

-- 分页码大于总页数,则把分页码置为总页数,表示取最后一页
If (@psPageIndex>@rsPageCount and @rsPageCount>0)
Begin
Set @psPageIndex=@rsPageCount
End

-- 如果@psOrderType不是0,则降序
If (@psOrderType<>0)
Begin
Set @strFlag='<'
Set @strParams='min'
Set @strOrder=' order by '+@psFieldName+' desc '
--检查第二排序字段是否为空,不是的话,按照第二字段排序
if(dbo.fu_isnull(@psFieldName2)=1)
begin
Set @strOrder=' order by '+@psFieldName+' desc '+','+@psFieldName2+' desc '
end

End
Else
Begin
Set @strFlag='>'
Set @strParams='max'
Set @strOrder=' order by '+@psFieldName+' asc '
--检查第二排序字段是否为空,不是的话,按照第二字段排序
if(dbo.fu_isnull(@psFieldName2)=1)
begin
Set @strOrder=' order by '+@psFieldName+' asc '+','+@psFieldName2+' asc '
end
End

-- 主语句(如果是第一次则加速执行)
If (@psPageIndex=1)
Begin
If (dbo.fu_isnull(@psStrWhere)=1)
Begin
Set @strSql=' select top '+ltrim(rtrim(str(@psPageSize)))+' '+@psStrGetFields+' from '+@psTblName+' where '
End
Else
Begin
Set @strSql=' select top '+ltrim(rtrim(str(@psPageSize)))+' '+@psStrGetFields+' from '+@psTblName
End
End
Else
Begin
-- 如果TOP值少于5300,把数据插入临时表,求MAX值
If ((@psPageIndex-1)*@psPageSize)<=5300
Begin
Set @strMax=' select top '
+ ltrim(rtrim(str((@psPageIndex-1)*@psPageSize)))+' '+@psStrGetFields
+ ' into #Tbls from '+@psTblName

Set @strDropTbls =' drop table #Tbls'

-- 判断是否有条件值
If (dbo.fu_isnull(@psStrWhere)=1)
Begin
Set @strMax=@strMax+' where '+@psStrWhere+' '+@strOrder

Set @strSql='select top '+ltrim(rtrim(str(@strPageSize)))+' '+@psStrGetFields+' from '+@psTblName
+ ' where '+@psFieldName+''+@strFlag+'(select '
+ @strParams+'('+@psFieldName+') from #Tbls) and '
End
Else
Begin
Set @strMax=@strMax+@strOrder
Set @strSql='select top '+ltrim(rtrim(str(@strPageSize)))+' '+@psStrGetFields+' from '+@psTblName
+ ' where '+@psFieldName+''+@strFlag+'(select '
+ @strParams+'('+@psFieldName+') from #Tbls) '
End
End
Else
Begin
-- 不用临时表来求SQL语句
Set @strMax='declare @strTmp varchar(500)'
+ ' select @strTmp= '+@strParams+'('+@psFieldName+') from (select top '
+ ltrim(rtrim(str((@psPageIndex-1)*@psPageSize)))+' '+@psFieldName+' from '
+ @psTblName

-- 判断是否有条件值
If (dbo.fu_isnull(@psStrWhere)=1)
Begin
Set @strSql=' where '+@psStrWhere+' '+@strOrder+') as tblTmp select top '
+ @strPageSize+' '+@psStrGetFields+' from '+@psTblName
+ ' where '+@psFieldName+' '+@strFlag+' @strTmp and '
End
Else
Begin
Set @strSql=@strOrder+') as tblTmp select top '
+ @strPageSize+' '+@psStrGetFields+' from '+@psTblName
+ ' where '+@psFieldName+' '+@strFlag+' @strTmp '
End
End
End

-- 输出
Exec (@strMax+@strSql+@psStrWhere+@strOrder+@strDropTbls)
--print @strMax+@strSql+@psStrWhere+@strOrder+@strDropTbls
If @@error<>0
Begin
return 0
End
Else
Begin
return 1
End
End
GO

网上的也很多,你可以找找更好的,但是这个已经很好了,哈
邢少 | 园豆:10926 (专家六级) | 2009-09-24 15:04
0

关于ASP.NET分页的文章,你可以到这里找找:http://www.765.com.cn/info/webpro/aspnet/Index.html

jime | 园豆:210 (菜鸟二级) | 2009-09-24 15:04
0

直接用.NETPager分页控件就好了

风浪 | 园豆:2861 (老鸟四级) | 2009-09-24 15:39
0

可以用DataAdapter Fill的方式选择填充多少记录,但这种方式是把所有的记录都查询出来。

最简单用 select top 10 * from table where id not in (select top ((pageCount-1)*pageSize) id from table),这种方式支持多种排序的方式

如果是按一定顺序排序,那么可以用MAX Id的函数也可以做分页

如果是sql 2005 可以用row_num的方式分页

如果用Linq to sql,可以用Skip().Take()的方式分页

poplau | 园豆:59 (初学一级) | 2009-09-24 16:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册