vb6编程 怎么从sqlServer返回分页显示的记录?

jmeycn 2017-01-26 04:21:38
如题,我现在都是先取全表,再分页显示,能不能数据库自动返回指定范围的记录。比如第100到120行,我原来的表没有定义行数这个字段,而且数据每天都有添加或删除操作。
...全文
844 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jmeycn 2017-07-02
  • 打赏
  • 举报
回复
网上搜了一段服务器分页返回结果集
CREATE PROCEDURE [dbo].[P_Pages]
@PCount int ,    --请求页数
@PageSize int,      --页大小
@Table nvarchar(100),    --查询表名
@Fields nvarchar(500),    --查询字段
@Where nvarchar(500),    --查询条件
@Order nvarchar(100)     --排序字段
AS
begin
declare @i int,@px int,@py int
declare @pMax int,@sql nvarchar(2000)

--总记录数
set @sql='select @i=count(1) from '+@Table
exec sp_executesql @sql, N'@i int out,@Table nvarchar(100)', @i out, @Table;

--总页数
set @pMax=floor(@i/@pagesize)+1
if  @i%@pagesize=0 set @pMax=@pMax-1;

if @PageSize<2 set @PageSize=2
--每页记录始末
if @pcount<1 set @pcount=1
if @pcount>@pMax set @pcount=@pMax
select @px=(@pcount-1)*@pagesize,@py=@pcount*@pagesize;
set @sql='SELECT '+ @Fields +' FROM(
    SELECT TOP '+CAST(@py AS NVARCHAR) +' ROW_NUMBER() OVER(ORDER BY '+@Order+') AS ROWID,* 
    FROM '+@Table+' Where '+@Where+') AS tmp1 WHERE ROWID>'+CAST(@px AS NVARCHAR)
print (@sql);
exec (@sql);
end
测试: exec P_pages 10,5,'account','*','','name asc'
jmeycn 2017-07-02
  • 打赏
  • 举报
回复
引用 4 楼 of123 的回复:
分页是 recordset 对象的固有功能。 With rs .CursorLocation = adUseClient .Open "<你的 SQL 语句>", conn, adOpenKeyset, adLockOptimistic .PageSize = 20 iCount = .PageCount End With 要跳转到 100 行所在页 rs.AbsolutePage = 100 \ rs.PageSize + 1 页号是以 1 为起点的,最大为 PageCount。
实际上rs是对sql查询返回的结果集再做分页处理,如果查询的数据量很大怎么办? 我希望的是在服务器端写个过程,每次就返回一页数据量
qq_35571084 2017-02-27
  • 打赏
  • 举报
回复
引用 4 楼 of123 的回复:
分页是 recordset 对象的固有功能。 With rs .CursorLocation = adUseClient .Open "<你的 SQL 语句>", conn, adOpenKeyset, adLockOptimistic .PageSize = 20 iCount = .PageCount End With 要跳转到 100 行所在页 rs.AbsolutePage = 100 \ rs.PageSize + 1 页号是以 1 为起点的,最大为 PageCount。
最近编写程序经常在论坛找解决方法,都有看到你回复,对于初学者而言言简意赅,有联系方式留个加好友吗? 分页思路通过PageSize我也用过,给rs分页后怎么通过DataSource直接把所需要的页码那页记录赋值给控件的DataSource? 还有操作Access的SQL语言和MySQL语言有哪些区别?
qq_35571084 2017-02-27
  • 打赏
  • 举报
回复
引用 5 楼 u013249970 的回复:
RS.MoveNext '移动记录集指针到相应页数的第一条记录 Next I For I = 1 To JLS .TextMatrix(I, 0) = I .TextMatrix(I, 1) = RS!名称 .TextMatrix(I, 2) = RS!规格 .TextMatrix(I, 3) = RS!数量 .TextMatrix(I, 4) = RS!单位 RS.MoveNext Next I RS.Close Set RS = Nothing db.Close Set db = Nothing End With Label2.Caption = ZJL '在标签显示总记录数 Label3.Caption = ZYS '在标签显示总页数 Label4.Caption = DQYS '在标签显示当前页数 End Sub [/code]
我自己编写了一个分页控件交流一下,你是通过移动数据到下一行每个赋值给MSHF单元格,这样要循环好多次。我是改SQL语句,RecString = "select * from ( select top " & Top1 & " " & FieldsName & " from ( select top " & Top2 & " " & _ FieldsName & " from " & TableName & LikeStr & " ) order by " & OrderName & " desc ) order by " & OrderName & " asc" Top1为每页定义的记录个数,FieldsName数据库表名,Top2需要调到的页数*每页记录个数,OrderName为数据表的FieldName,比如59个记录,每页10行,我共有6页,到第5页,41-50这段记录,通过Top2=50,将前50条进行降序排列,那么41-50就排在最前面了,然后Top1=10在取最前面10条记录升序排列。Set MSHF.DataSource=Rec.DataSource,直接给它赋值。这个不好的地方就是你提取的数据是经过某个Field排序的。
nettman 2017-02-16
  • 打赏
  • 举报
回复
Tiger_Zhao 2017-02-07
  • 打赏
  • 举报
回复
可以用嵌套的SQL语句实现:内层用 ROW_NUMBER 生成序号,外层用序号作为过滤条件。
ZHRXJR 2017-02-07
  • 打赏
  • 举报
回复
我连接的是 2007 的 Access 数据库,你可以修改数据库连接语句连接到 SQL Server 各版本的数据库就可以了,其他可以不变。
ZHRXJR 2017-02-07
  • 打赏
  • 举报
回复
给你一个简单的例子,根据数据表记录属不同,显示不同页数,每页的显示记录数可以使用变量


Dim db As New ADODB.Connection, RS As New ADODB.Recordset, ZJL As Long, MYJL As Integer, DQYS As Integer, ZYS As Integer 'ZJL 是总记录变量, MYJL 是每页显示记录属变量,DQYS 是当前显示页数变量,ZYS 是总页数变量,均是模块级变量。

Private Sub KKK(db) '数据库连接过程
db.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & App.Path & "\ABC.accdb;Jet OLEDB:Database Password=;"
db.Open
End Sub

Private Sub Combo1_Click() '转到第几页的过程
DQYS = Val(Combo1.Text)
Call MSHF
End Sub

Private Sub Command1_Click()
'第一页
Combo1.Text = ""
DQYS = 1
Call MSHF
End Sub

Private Sub Command2_Click()
'下一页
Combo1.Text = ""
DQYS = DQYS + 1
If DQYS >= ZYS Then DQYS = ZYS
Call MSHF
End Sub

Private Sub Command3_Click()
'上一页
Combo1.Text = ""
DQYS = DQYS - 1
If DQYS <= 1 Then DQYS = 1
Call MSHF
End Sub

Private Sub Command4_Click()
'最后一页
Combo1.Text = ""
DQYS = ZYS
Call MSHF
End Sub

Private Sub Command5_Click()
End
End Sub

Private Sub Form_Load()
Combo1.Text = ""
MYJL = 15 '每页显示的记录数,根据你的需要修改即可
Call KKK(db)
RS.Open "select * from 数据表1 ", db, 3, 2
ZJL = RS.RecordCount '得到数据表的总记录
RS.Close
Set RS = Nothing
db.Close
Set db = Nothing
ZYS = ZJL \ MYJL '得到页数,ZYS定义的是整形数据,而且运算符是整除,因此不会有小数,也不会四舍五入
If ZJL Mod MYJL = 0 Then '判断页数是否是整数
ZYS = ZYS '是整数,页数正确
Else
ZYS = ZYS + 1 '不是整数,页数+1
End If
DQYS = 1
Call MSHF
Combo1.Clear
For I = 1 To ZYS
Combo1.AddItem I
Next I
End Sub

Private Sub MSHF() '在 MSHFlexGrid1 控件显示记录过程
Label2.Caption = ""
Label3.Caption = ""
Label4.Caption = ""
Dim JLS As Integer
If DQYS < ZYS Then
JLS = MYJL '如果显示页数小于总页数,显示记录是每页应该显示的记录
ElseIf DQYS = ZYS Then
JLS = ZJL - (DQYS - 1) * MYJL '如果显示页数等于总页数,显示记录是总记录减去已经显示的记录,即显示最后一页剩余的记录
End If
MSHFlexGrid1.Clear
MSHFlexGrid1.Visible = True
With MSHFlexGrid1 '这个块的代码就不需要注释了吧
.Cols = 5
.Rows = JLS + 1
.TextMatrix(0, 0) = Space(1) & "序号"
.TextMatrix(0, 1) = Space(5) & "名称"
.TextMatrix(0, 2) = Space(5) & "规格"
.TextMatrix(0, 3) = Space(3) & "数量"
.TextMatrix(0, 4) = Space(5) & "单位"
.ColWidth(0) = 800
.ColWidth(1) = 1800
.ColWidth(2) = 1800
.ColWidth(3) = 1000
.ColWidth(4) = 1800 '7695
Call KKK(db)
RS.Open "select * from 数据表1 ", db, 3, 2
For I = 1 To (DQYS - 1) * MYJL
RS.MoveNext '移动记录集指针到相应页数的第一条记录
Next I
For I = 1 To JLS
.TextMatrix(I, 0) = I
.TextMatrix(I, 1) = RS!名称
.TextMatrix(I, 2) = RS!规格
.TextMatrix(I, 3) = RS!数量
.TextMatrix(I, 4) = RS!单位
RS.MoveNext
Next I
RS.Close
Set RS = Nothing
db.Close
Set db = Nothing
End With
Label2.Caption = ZJL '在标签显示总记录数
Label3.Caption = ZYS '在标签显示总页数
Label4.Caption = DQYS '在标签显示当前页数
End Sub
of123 2017-02-07
  • 打赏
  • 举报
回复
分页是 recordset 对象的固有功能。 With rs .CursorLocation = adUseClient .Open "<你的 SQL 语句>", conn, adOpenKeyset, adLockOptimistic .PageSize = 20 iCount = .PageCount End With 要跳转到 100 行所在页 rs.AbsolutePage = 100 \ rs.PageSize + 1 页号是以 1 为起点的,最大为 PageCount。
赵4老师 2017-02-06
  • 打赏
  • 举报
回复
百度搜相关关键字。
jmeycn 2017-01-28
  • 打赏
  • 举报
回复
GG还回家快快快

1,217

社区成员

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

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