winform程序,分页查询方面的疑惑,
环境:数据库表中记录总数量大概1万多条,且还在增加
现在采用的方法:
(1).查询是多个表连接查询,且还有权限控制,表中有个主键字段,是一个流水号,现在的分页方法是按主键ID(即流水号)的顺序排序,再记录下当前页的ID,这种方式是可以实现,不过只能按固定的顺序浏览,现在的问题是:客户提出这种顺序不直观,可以自己定义查询的排序顺序,即打乱了这种表的内在主键顺序,曾采用过每次查询建立一个临时表,提取某页的数据后在删除临时表,但这样会造成很大的系统开销,也不是好办法.现求遇到过类似方面的问题的大哥给点建议或思路,谢谢!急...

解决方案 »

  1.   

    winform的DATAGRIDVIEW应该支持排序吧而且也只是视图的排序,不会影响到到你的DATATABLE中的数据顺序吧。。??
      

  2.   

    我理解他的意思,一旦ID打乱了,他就不知道用什么来判断分页的数据了,那样的可以考虑ID的重建,如果你还要修改数据的话,只能多加一个ID,和临时表估计也没有太大的区别
      

  3.   

    设每页为 10 条, count = 10;
    页码在每次点击时取得 page = 1;(初始状态)开始取数据select top count * from (select top count*page * from tablename) temptable order by columnname desc这样就可以了,要注意的是 count*page 是我偷懒写的,你应该先在程序中把这个值算出来,SQL语句里是不能帮你算的。columnname 就是你要用来自定义查询的列
      

  4.   

    参考下面的SQL查询方法
    其中:
    @maxlen是要查询的记录条页,即DataGridView每页要显示的记录数
    @startindex是从第多少条开始查询,假如用户点击第2页,每页显示40条记录,那么@startindex应为80select top @maxlen from 表名 where 主键字段名 not in (select top @startindex 主键字段名 from 表名 order by 排序字段名)
      

  5.   

    按照主键进行排序不是显示数据的好方法,应该由用户来确定如何排序。
    不需要临时表
    对于Oracle,可以利用rownum
    对与Sql Server 2005 可以利用新增的分析函数
    对于My Sql可以利用Limit
    对于Sql Server 2000这个分页的例子很多不知道楼主是不是担心新在分页的时候新数据进来打乱排序顺序的问题,其实这个并不需要担心,新增的数据会按照排序的方式插入到整个数据集中PS:分页的例子很多,一般会有如下几个参数,1、要排序的表/视图 2,输出的字段列表,3 当前页数 4每页页数 5 查询条件 6 排序方式
    soso
      

  6.   

    谢谢各位,目前是SQL Server2000上,也见了许多分页的存储过程,当然原理如果不按主键顺序的话,大多数是采用临时表的方法,如果数据记录较多,这种方法效率不高,是想看有更好的方法没有
      

  7.   


    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