本三层结构 中间层采用的ro da,数据库采用的oracle 10g, 客户端使用了cxgrid问题:现在某些表,记录数很多,打开特别慢。我想知道能不能做一个比较通用的函数让数据记录非常多的表,每次只传递部分数据给客户端,客户端通过 命令  分页查看余下的记录,或者显示全部的记录。这个函数  可以放在中间层  或者  数据库层,我觉得都可以因为程序已经做好了,希望改动能比较少麻烦大侠 给个办法来实现,谢谢

解决方案 »

  1.   

    通过sql取分页数据,这一个技术,跟你几层没关系
      

  2.   

    如果使用dbexpress连接,设置SimpleDataSet/ClientDataSet控件的PacketRecords属性即可控制传递给客户端记录的数量。
      

  3.   

    建议根据客户端DBGRid每页的栏格数,通过SQL分页技术,向客户端传递数据。
      

  4.   

    1.分页方案一:(利用Not In和SELECT TOP分页)语句形式:SELECTTOP10*
    FROMTestTable
    WHERE(IDNOTIN
         (SELECTTOP20id
        FROMTestTable
        ORDERBYid))
    ORDERBYID
    SELECTTOP页大小*
    FROMTestTable
    WHERE(IDNOTIN
         (SELECTTOP页大小*页数id
        FROM表
        ORDERBYid))
    ORDERBYID 2.分页方案二:(利用ID大于多少和SELECT TOP分页)  语句形式:  SELECTTOP10*
    FROMTestTable
    WHERE(ID>
         (SELECTMAX(id)
        FROM(SELECTTOP20id
            FROMTestTable
            ORDERBYid)AST))
    ORDERBYID
    SELECTTOP页大小*
    FROMTestTable
    WHERE(ID>
         (SELECTMAX(id)
        FROM(SELECTTOP页大小*页数id
            FROM表
            ORDERBYid)AST))
    ORDERBYID 3.分页方案三:(利用SQL的游标存储过程分页)create procedureSqlPager
    @sqlstrnvarchar(4000),--查询字符串
    @currentpageint,--第N页
    @pagesizeint--每页行数
    as
    setnocounton
    declare@P1int,--P1是游标的id
    @rowcountint
    execsp_cursoropen@P1output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcountoutput
    selectceiling(1.0*@rowcount/@pagesize)as总页数--,@rowcountas总行数,@currentpageas当前页
    set@currentpage=(@currentpage-1)*@pagesize+1
    execsp_cursorfetch@P1,16,@currentpage,@pagesize
    execsp_cursorclose@P1
    setnocountoff 
      

  5.   

    最简单最方便的就是设置一个包多少条记录,就是ClientDataset的PacketRecords属性