如何把查询到的数据加上一个自动编号实现数据随意提取,关于分页程序--送分

专注VB编程开发20年 2003-08-29 09:45:27
我想实现数据结果自动加上一个列,然后按id>50 id<70获得50-70之间的数据,事实上是为了实现分页程序,就不必把数据结果每次都在内存中大量占用,比如10万条数据,好几百页,那多慢呀,我要显示第几而几十条数据,服务器就不会负担太重了
...全文
151 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2003-11-17
  • 打赏
  • 举报
回复
--程序中不建议用存储过程.

参考我的贴子:
http://expert.csdn.net/Expert/topic/2365/2365596.xml?temp=.8941614
zjcxc 2003-11-16
  • 打赏
  • 举报
回复
SQL SERVER数据库.
/*--用存储过程实现的分页程序

显示指定查询结果的第X页
此存储过程针对无主键的情况,使用临时表的方法
如果有主键,不推荐此方法

--邹建 2003.09*/

/*--调用示例
exec p_show 'select * from xzkh_new..地区资料'

exec p_show 'select * from xzkh_new..地区资料',5,2,'地区编号,地区名称,助记码','地区编号'
--*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_show]
GO

CREATE Proc p_show
@QueryStr nvarchar(1000), --查询语句,如果查询表,用:select * from 表
@PageSize int=10, --每页的大小(行数)
@PageCurrent int=1, --要显示的页
@FdShow nvarchar (1000)='', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000)='' --排序字段列表
as
set nocount on
declare @FdName nvarchar(50) --标识列名
,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
select @FdName='[ID_'+cast(newid() as varchar(40))+']'
,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))
,@FdShow=case isnull(@FdShow,'') when '' then '*' else @FdShow end
,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end

exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
into #tb from('+@QueryStr+') a '+@FdOrder+'
select '+@FdShow+' from #tb where '+@FdName+' between '
+@Id1+' and '+@Id2
)
set nocount off
GO


yoki 2003-11-15
  • 打赏
  • 举报
回复
access也可以呀

ALTER TABLE tableName add COLUMN Id COUNTER (1, 1)
Select * From tableName where Id>50 and Id<70
yoki 2003-11-15
  • 打赏
  • 举报
回复
access也可以呀
那要用临时表的办法--对于SQL数据库:
ALTER TABLE tableName add COLUMN Id COUNTER (1, 1)
Select * From tableName where Id>50 and Id<70
hhfh 2003-11-15
  • 打赏
  • 举报
回复
调用以上存储过程
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=SQLOLEDB.1;Password=22222;Persist Security Info=True;User ID=sa;Initial Catalog=haha;Data Source=hhfh"
cn.Open
Set rs = New ADODB.Recordset
Dim Rsd As New ADODB.Command
Set rs = cn.Execute("exec p_show 'select * from std_tab',50,1,'std,org_num','org_num'")
msgbox rs.state
在查询分析器可以显示正常结果
但是我在vb代码中用ado执行存储过程,rs.state的状态是关闭的,没打开!
我想显示记录集结果rs("std") 说rs没打开不行,怎么解决这个问题!?
zjcxc 2003-09-02
  • 打赏
  • 举报
回复
SQL SERVER数据库.
/*--用存储过程实现的分页程序

显示指定查询结果的第X页
此存储过程针对无主键的情况,使用临时表的方法
如果有主键,不推荐此方法

--邹建 2003.09*/

/*--调用示例
exec p_show 'select * from xzkh_new..地区资料'

exec p_show 'select * from xzkh_new..地区资料',5,2,'地区编号,地区名称,助记码','地区编号'
--*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_show]
GO

CREATE Proc p_show
@QueryStr nvarchar(1000), --查询语句,如果查询表,用:select * from 表
@PageSize int=10, --每页的大小(行数)
@PageCurrent int=1, --要显示的页
@FdShow nvarchar (1000)='', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000)='' --排序字段列表
as
declare @FdName nvarchar(50) --标识列名
,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
select @FdName='[ID_'+cast(newid() as varchar(40))+']'
,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))
,@FdShow=case isnull(@FdShow,'') when '' then '*' else @FdShow end
,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end

exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
into #tb from('+@QueryStr+') a '+@FdOrder+'
select '+@FdShow+' from #tb where '+@FdName+' between '
+@Id1+' and '+@Id2
)
GO

  • 打赏
  • 举报
回复
是啊,可是我想取得中间某段就不能用top了呀
showflow 2003-08-31
  • 打赏
  • 举报
回复
或许可以写个存储过程,传个范围,用游标scroll
changechange 2003-08-30
  • 打赏
  • 举报
回复
第一,ado本身就支持自动分页,上面已经有人把帮助贴出来了
第二,直接用 select top 语句就可以了,何必再动态生成id?
请参考:
http://access911.net/index.asp?board=4&mode=3&recordid=72FAB41E14DC
taosihai1only 2003-08-30
  • 打赏
  • 举报
回复
select id=identity(int,1,1),* into #tb from 表
select * from #tb where id>50 and id<70
  • 打赏
  • 举报
回复
php就可用limit支持,只可惜一般的数据库及开发语言都不支持(asp,vb,c***)
  • 打赏
  • 举报
回复
我就是觉得用分页方法太繁了,
要用临时表的办法--对于SQL数据库:
select id=identity(int,1,1),* into #tb from 表
select * from #tb where id>50 and id<70
可用于access就不行了,如何办呀?
TechnoFantasy 2003-08-29
  • 打赏
  • 举报
回复
有些数据库支持rowid的方式查找的,例如oracle。
zjcxc 2003-08-29
  • 打赏
  • 举报
回复
其实,你可以直接用ADO的RECORESET对象实现分页效果:


AbsolutePage、PageCount 和 PageSize 属性范例
该范例使用 AbsolutePage、PageCount 和 PageSize 属性,以每次五个记录的方式显示雇员表中的姓名和受雇日期。

Public Sub AbsolutePageX()

Dim rstEmployees As ADODB.Recordset
Dim strCnn As String
Dim strMessage As String
Dim intPage As Integer
Dim intPageCount As Integer
Dim intRecord As Integer

' 使用客户端游标为雇员表打开一个记录集。
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
Set rstEmployees = New ADODB.Recordset
' 使用客户端游标激活 AbsolutePosition 属性。
rstEmployees.CursorLocation = adUseClient
rstEmployees.Open "employee", strCnn, , , adCmdTable

' 显示姓名和受雇日期,每次五个记录。
rstEmployees.PageSize = 5
intPageCount = rstEmployees.PageCount
For intPage = 1 To intPageCount
rstEmployees.AbsolutePage = intPage
strMessage = ""
For intRecord = 1 To rstEmployees.PageSize
strMessage = strMessage & _
rstEmployees!fname & " " & _
rstEmployees!lname & " " & _
rstEmployees!hire_date & vbCr
rstEmployees.MoveNext
If rstEmployees.EOF Then Exit For
Next intRecord
MsgBox strMessage
Next intPage
rstEmployees.Close

End Sub
zjcxc 2003-08-29
  • 打赏
  • 举报
回复
那要用临时表的办法--对于SQL数据库:

select id=identity(int,1,1),* into #tb from 表
select * from #tb where id>50 and id<70
  • 打赏
  • 举报
回复
因为不是所有表都有id数据列,所以要求自动生成一个虚拟列

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧