DataGrid分页或者select top 15 * from T01 where id > flag //flag记录上一次最大的ID值
To:楼上朋友 很感谢你们的关注,但我认为你们的方法应该不是完美的解决方案。 不知各位是否使用过PL/SQL Developer,当你发出一个查询语句后,不是显示全部,而是先显示最前面的几条记录,再显示两个按钮“Fetch next page”,“Fetch last page”,这样可以做到很友好的效果
select top 10 * from T015万条也算多? 一张表200个字段,一年3亿6千万条数据,很爽吧。如果你想找31~40条数据可以这样写: select top 10 * from(select top 40 * from T01)
抱歉,少了句代码。 select top 10 * from (select top 40 * from T01 order by ID desc)先找出头40条,倒序排列,再在这40条倒序排列的数据里找出头10条。
建议使用分页的存储过程。 CREATE proc page @pagenum int as SET NOCOUNT ON /*-----这一句很重要哦:)),不然它只会认 insert #change......这个数据集:))*/ declare @sql nvarchar(500) --声明动态sql执行语句 declare @pagecount int --当前页数--取得当前数据库的记录总数 declare @row_num int begin select @row_num=count(*) from cat_list--创建临时表,作为数据过滤 create table #change (T_id int)--判断当前页数 if @row_num>6 --大于页面显示记录数,则分页 begin set @row_num=@pagenum*6if @row_num=6 select top 6 * from cat_list else begin set @row_num=(@pagenum-1)*6 set @pagecount=@row_num set @sql=N'insert #change (T_id) select top '+cast(@pagecount as char(100))+' T_id from cat_list where T_id not in (select T_id from #change)' exec sp_executesql @sql select top 6 * from cat_list where T_id not in (select T_id from #change) end end else --只现实全部的数据 select * from cat_list end GO 客户端这样调用: <!--#include file="conn.asp"--> <!--#include file="adovbs.inc"--> <% dim T_com dim T_rs'declare datamanage recordset dim parameters set T_com=server.createobject("adodb.command") T_com.ActiveConnection=conn T_com.CommandText="page" T_com.CommandType=adCmdStoredProc 'T_com.Prepared=true set parameters=T_com.CreateParameter("@pagenum",adInteger,adParamInput) T_com.Parameters.Append parameters dim page page=request.QueryString("page") if page="" then page=1 end if T_com("@pagenum")=page set T_rs=T_com.Executedo while not T_rs.eof response.Write T_rs("c_name") T_rs.movenext loop %> <a href="a.asp?page=<%=page+1%>">ddddd</a>
第X页,每页15条 如果表中记录不重复的字段,可以用下面的方法,当然(x-1)*15要换成具体的数字,不能用变量: select top 15 * from tableName where 不重复的字段 not in(select top (x-1)*15 主键 from tableName)如果表中无主键,可以用临时表,加标识字段解决.这里的x可以用变量.select id=identity(int,1,1),* into #tb from 表 select * from #tb where id between (x-1)*15 and x*15-1
设置4个图片按钮(第一页,上一页,下一页,最后一页),
每个按钮上设置不同的oncommand事件,
然后分别写4个处理程序,每个程序的最后关闭DataReader,关闭CONN(连接)看行不。
很感谢你们的关注,但我认为你们的方法应该不是完美的解决方案。 不知各位是否使用过PL/SQL Developer,当你发出一个查询语句后,不是显示全部,而是先显示最前面的几条记录,再显示两个按钮“Fetch next page”,“Fetch last page”,这样可以做到很友好的效果
from T015万条也算多?
一张表200个字段,一年3亿6千万条数据,很爽吧。如果你想找31~40条数据可以这样写:
select top 10 *
from(select top 40 *
from T01)
select top 10 *
from (select top 40 *
from T01
order by ID desc)先找出头40条,倒序排列,再在这40条倒序排列的数据里找出头10条。
CREATE proc page
@pagenum int
as
SET NOCOUNT ON /*-----这一句很重要哦:)),不然它只会认 insert #change......这个数据集:))*/
declare @sql nvarchar(500) --声明动态sql执行语句
declare @pagecount int --当前页数--取得当前数据库的记录总数
declare @row_num int
begin
select @row_num=count(*) from cat_list--创建临时表,作为数据过滤
create table #change (T_id int)--判断当前页数
if @row_num>6 --大于页面显示记录数,则分页
begin
set @row_num=@pagenum*6if @row_num=6
select top 6 * from cat_list
else
begin
set @row_num=(@pagenum-1)*6
set @pagecount=@row_num
set @sql=N'insert #change (T_id) select top '+cast(@pagecount as char(100))+' T_id from cat_list where T_id not in (select T_id from #change)'
exec sp_executesql @sql
select top 6 * from cat_list where T_id not in (select T_id from #change)
end
end
else --只现实全部的数据
select * from cat_list
end
GO
客户端这样调用:
<!--#include file="conn.asp"-->
<!--#include file="adovbs.inc"-->
<% dim T_com
dim T_rs'declare datamanage recordset
dim parameters
set T_com=server.createobject("adodb.command")
T_com.ActiveConnection=conn
T_com.CommandText="page"
T_com.CommandType=adCmdStoredProc
'T_com.Prepared=true
set parameters=T_com.CreateParameter("@pagenum",adInteger,adParamInput)
T_com.Parameters.Append parameters
dim page
page=request.QueryString("page")
if page="" then
page=1
end if
T_com("@pagenum")=page
set T_rs=T_com.Executedo while not T_rs.eof
response.Write T_rs("c_name")
T_rs.movenext
loop
%>
<a href="a.asp?page=<%=page+1%>">ddddd</a>
你的方法不知道对执行效率如何。
但我看出你的存储过程有一个问题,(取出当前数据表的记录总数),你是取出了整个表,但如果用户输入的SQL是带条件参数,就不知道其中的记录数了。当然也可以执行用户的SQL后得到记录数,但效率会大大降低
如果表中记录不重复的字段,可以用下面的方法,当然(x-1)*15要换成具体的数字,不能用变量:
select top 15 * from tableName where 不重复的字段 not in(select top (x-1)*15 主键 from tableName)如果表中无主键,可以用临时表,加标识字段解决.这里的x可以用变量.select id=identity(int,1,1),* into #tb from 表
select * from #tb where id between (x-1)*15 and x*15-1
我的想法是将用户Select 语句一次执行,但显示却是分批,这样的效率应该会高一些。
但不知道怎样实现?
不一定限制在SQL语句上,也可以使用DoNet,只要能做到。
做一个全局的数据集和全局的数据连线
每次读N条记录出来显示,游标移动N条
记录(包括上下)
如果是数据绑定的话就不合适了
那只能用Procedure了。
我要的效果不一定要在DataGrid中体现的,可以输出在文本框或其它地方。我想要的是一种解决方案。
但还是很感谢你们的意见!
但还没有好的解决方案