winform程序,分页查询方面的疑惑,
环境:数据库表中记录总数量大概1万多条,且还在增加
现在采用的方法:
(1).查询是多个表连接查询,且还有权限控制,表中有个主键字段,是一个流水号,现在的分页方法是按主键ID(即流水号)的顺序排序,再记录下当前页的ID,这种方式是可以实现,不过只能按固定的顺序浏览,现在的问题是:客户提出这种顺序不直观,可以自己定义查询的排序顺序,即打乱了这种表的内在主键顺序,曾采用过每次查询建立一个临时表,提取某页的数据后在删除临时表,但这样会造成很大的系统开销,也不是好办法.现求遇到过类似方面的问题的大哥给点建议或思路,谢谢!急...
环境:数据库表中记录总数量大概1万多条,且还在增加
现在采用的方法:
(1).查询是多个表连接查询,且还有权限控制,表中有个主键字段,是一个流水号,现在的分页方法是按主键ID(即流水号)的顺序排序,再记录下当前页的ID,这种方式是可以实现,不过只能按固定的顺序浏览,现在的问题是:客户提出这种顺序不直观,可以自己定义查询的排序顺序,即打乱了这种表的内在主键顺序,曾采用过每次查询建立一个临时表,提取某页的数据后在删除临时表,但这样会造成很大的系统开销,也不是好办法.现求遇到过类似方面的问题的大哥给点建议或思路,谢谢!急...
页码在每次点击时取得 page = 1;(初始状态)开始取数据select top count * from (select top count*page * from tablename) temptable order by columnname desc这样就可以了,要注意的是 count*page 是我偷懒写的,你应该先在程序中把这个值算出来,SQL语句里是不能帮你算的。columnname 就是你要用来自定义查询的列
其中:
@maxlen是要查询的记录条页,即DataGridView每页要显示的记录数
@startindex是从第多少条开始查询,假如用户点击第2页,每页显示40条记录,那么@startindex应为80select top @maxlen from 表名 where 主键字段名 not in (select top @startindex 主键字段名 from 表名 order by 排序字段名)
不需要临时表
对于Oracle,可以利用rownum
对与Sql Server 2005 可以利用新增的分析函数
对于My Sql可以利用Limit
对于Sql Server 2000这个分页的例子很多不知道楼主是不是担心新在分页的时候新数据进来打乱排序顺序的问题,其实这个并不需要担心,新增的数据会按照排序的方式插入到整个数据集中PS:分页的例子很多,一般会有如下几个参数,1、要排序的表/视图 2,输出的字段列表,3 当前页数 4每页页数 5 查询条件 6 排序方式
soso
USE [NDKM]
GO
/****** 对象: StoredProcedure [dbo].[doc_PagingPR] 脚本日期: 04/09/2008 08:59:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[doc_PagingPR]
(
---- 输入参数 ----
@PageSize INT, ---- 页面大小
@CurrentPageIndex INT, ---- 当前页索引
@DataTableCode VARCHAR(50), ---- 数据表代码
@DataKeyCode VARCHAR(50), ---- 数据主键代码
@DESCFlag BIT = 0, ---- 按逆序输出还是正序输出
@SearchCondition VARCHAR(1000) = '' ---- 检索条件
)
AS
---- 关闭计数器 ----
SET NOCOUNT ON
---- 变量声明 ----
DECLARE @CurrentID INT
DECLARE @strSQL NVARCHAR(500)
DECLARE @OrderBy NVARCHAR(50)
DECLARE @OffsetNum INT
---- 检索条件处理 ----
IF @SearchCondition <> ''
SET @SearchCondition = N' WHERE ' + @SearchCondition
---- 排序条件处理 ----
IF @DESCFlag = 0
SET @OrderBy = N' Order By ' + @DataKeyCode + ' ASC '
ELSE
SET @OrderBy = N' Order By ' + @DataKeyCode + ' DESC '
---- 当前页索引处理 ----
IF @CurrentPageIndex < 0
SET @CurrentPageIndex = 0
---- 计算当前页第一条记录偏移量 ----
SELECT @OffsetNum = @CurrentPageIndex * @PageSize + 1
---- 读取当前页第一条记录的唯一标识 ----
SET @strSQL = N' SET ROWCOUNT @OffsetNum '
SET @strSQL = @strSQL + N' SELECT @CurrentID = ' + @DataKeyCode + ' FROM ' + @DataTableCode + @SearchCondition + ' ' + @OrderBy
SET @strSQL = @strSQL + N' SET ROWCOUNT 0 '
EXEC SP_EXECUTESQL @strSQL, N'@OffsetNum INT,@DataKeyCode VARCHAR(50), @DataTableCode VARCHAR(50), @SearchCondition VARCHAR(50), @OrderBy VARCHAR(20), @CurrentID INT OUTPUT', @OffsetNum,@DataKeyCode, @DataTableCode, @SearchCondition, @OrderBy, @CurrentID OUTPUT
---- 条件处理 ----
IF @SearchCondition = ''
IF @DESCFlag = 0
SET @SearchCondition = ' WHERE ' + @DataKeyCode + ' >= ' + str(@CurrentID)
ELSE
SET @SearchCondition = ' WHERE ' + @DataKeyCode + ' <= ' + str(@CurrentID)
ELSE
IF @DESCFlag = 0
SET @SearchCondition = @SearchCondition + ' AND ' + @DataKeyCode + ' >= ' + str(@CurrentID)
ELSE
SET @SearchCondition = @SearchCondition + ' AND ' + @DataKeyCode + ' <= ' + str(@CurrentID)
---- 获取最终结果 ----
SET @strSQL = N'SELECT Top ' + RTRIM(LTRIM(STR(@PageSize))) + ' * FROM ' + @DataTableCode + @SearchCondition + ' ' + @OrderBy
EXEC SP_EXECUTESQL @strSQL, N'@PageSize INT,@DataKeyCode VARCHAR(50), @DataTableCode VARCHAR(50), @SearchCondition VARCHAR(50), @OrderBy VARCHAR(20)', @OffsetNum,@DataKeyCode, @DataTableCode, @SearchCondition, @OrderBy
---- 打开计数器 ----
SET NOCOUNT ON
RETURN