<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我是FE,也是Fe

    前端來(lái)源于不斷的點(diǎn)滴積累。我一直在努力。

    統(tǒng)計(jì)

    留言簿(15)

    閱讀排行榜

    評(píng)論排行榜

    Sql server 2000 jdbc 查詢分頁(yè)解決方案

    (今天看自己的blog,發(fā)現(xiàn)上次更新已經(jīng)是3-20,堅(jiān)持每周更新blog! )

    之所以要把sql server 2000 jdbc 分頁(yè)單獨(dú)來(lái)說(shuō)說(shuō),又兩個(gè)地方還是值得一提,一者是sql server 2000要實(shí)現(xiàn)數(shù)據(jù)庫(kù)分頁(yè)是比較麻煩的事情。二者是jdbc查詢出多個(gè)ResultSet 的取法。

    先在項(xiàng)目的classpath中添加msbase.jar,mssqlserver.jar,msutil.jar 怎么來(lái)的就不多廢話了。需要說(shuō)的是我最先用的sql server 2005 jdbc驅(qū)動(dòng)sqljdbc.jar放到項(xiàng)目中,后來(lái)的程序是報(bào)錯(cuò)的。回頭想想,報(bào)錯(cuò)有理,sql server 2005 已經(jīng)支持rownum 分頁(yè)了。

    先說(shuō)說(shuō)sql server 2000的分頁(yè)的實(shí)現(xiàn),目前實(shí)現(xiàn)方法大概是那三種。我個(gè)人還是喜歡使用存儲(chǔ)過(guò)程,原因是使用非常方便,至于使用的存儲(chǔ)過(guò)程,這里還是放出來(lái)看看,估計(jì)大家用的都大同小異。

    IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Pr_QueryByPage]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
    BEGIN
    EXEC dbo.sp_executesql @statement = N'create     procedure   [dbo].[Pr_QueryByPage]   
    @sqlstr   nvarchar(4000),   --查詢sql  
    @currentpage   int, --第頁(yè)記錄條數(shù)  
    @pagesize   int --每頁(yè)顯示記錄 
    as   
    set   nocount   on   
    declare   @P1   int, --P1是游標(biāo)的ID  
    @rowcount   int   
    exec   sp_cursoropen   @P1   output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount   output   
    select   ceiling(1.0*@rowcount/@pagesize)   as TotalPage,@rowcount as [RowCount] 
    set   @currentpage=(@currentpage-1)*@pagesize+1   
    exec   sp_cursorfetch   @P1,16,@currentpage,@pagesize     
    exec   sp_cursorclose   @P1   
    set   nocount   off  ' 
    END
    GO

    這個(gè)存儲(chǔ)過(guò)程的實(shí)現(xiàn),使用了三個(gè)系統(tǒng)存儲(chǔ)過(guò)程sp_cursoropen ,sp_cursorfetch ,sp_cursorclose 從字面上的意思大概是他叫結(jié)果集使用游標(biāo)打開,然后讀取其中的@pageSize條記錄,所以單從查詢上來(lái)講,性能是不及使用select top 之類的實(shí)現(xiàn)。

     

    使用起來(lái)非常容易,exec Pr_QueryByPage 'select * from yourtable',1,10  就可以了麻煩的是他返回的是三張表。第一張表是查詢的表,但是沒(méi)有記錄。第二個(gè)表一行兩列,第一個(gè)列是總頁(yè)數(shù),第二個(gè)列是總記錄條數(shù)。第三張表才是需要的數(shù)據(jù)。這就造成了取的時(shí)候有點(diǎn)小麻煩,因?yàn)橹爸恢溃?net中可以直接fill(DataSet),然后DataSet里面可取DataTable。但是在jdbc里面我映像中ResultSet 只能容一張表。后來(lái)找了一些資料,原來(lái)PreparedStatement,CallableStatement,Statement都支持查詢返回多個(gè)ResultSet ,好了,非常好。 下面是我使用CallableStatemnt取到的結(jié)果集。

     

    CallableStatement cs = conn.prepareCall("exec Pr_QueryByPage 'select * from ckdmzd',1,10");
                ResultSet rs = null;
                /**
                 * execute returns :
                 *     true : returns ResultSet(s)
                 *  false: returns rows affected
                 */
                boolean hasResultSet = cs.execute();
                if(hasResultSet){
                    /**
                     * skip the first ResultSet
                     */
                    rs=cs.getResultSet();
                    /**
                     * second ResultSet : pageCount & recordCount
                     */
                    if(cs.getMoreResults()){
                        rs=cs.getResultSet();
                        while(rs.next()){
                            String pageCount=rs.getString(1);
                            String recordCount=rs.getString(2);
                        }
                    }
                    /**
                     * the thrid one is the paged result
                     */
                    if(cs.getMoreResults()){
                        rs=cs.getResultSet();
                        while(rs.next()){
                            // do somthing with ResultSet
                        }
                    }
                }

    這樣就實(shí)現(xiàn)了分頁(yè),網(wǎng)上很多人測(cè)試了,這個(gè)方法的性能不及別的方法,這里我要指出的是,別的方法是不能返回總的記錄條數(shù)的。而要知道總的記錄條數(shù),通常需要select count(*) from ( your sql) 這兩次查詢叫起來(lái)的時(shí)間未必會(huì)少。

    總結(jié)

    使用上述方法實(shí)現(xiàn)sql server 2000 jdbc 分頁(yè),使用方便,性能還說(shuō)的過(guò)去。我不知道sql server 2005 的查詢性能是否又提升。

    posted on 2009-04-03 16:55 衡鋒 閱讀(1684) 評(píng)論(1)  編輯  收藏 所屬分類: j2ee

    評(píng)論

    # re: Sql server 2000 jdbc 查詢分頁(yè)解決方案 2011-09-15 08:32 tb

    2005 性能比較高點(diǎn)   回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 亚洲成av人片不卡无码| 精品成在人线AV无码免费看 | 亚洲黄色在线网站| 全部免费国产潢色一级| 一本岛高清v不卡免费一三区| 国产黄色免费观看| 青草久久精品亚洲综合专区| 亚洲精彩视频在线观看| 亚洲成亚洲乱码一二三四区软件| 亚洲Av无码乱码在线观看性色| 最近的免费中文字幕视频| 24小时免费看片| 免费av一区二区三区| 香蕉免费一级视频在线观看| 二级毛片免费观看全程| 亚洲AV成人一区二区三区观看| 久久久久精品国产亚洲AV无码| 久久久久亚洲精品日久生情| 久久亚洲国产欧洲精品一| 国产精品亚洲二区在线观看| 国产免费小视频在线观看| 日本无卡码免费一区二区三区| 少妇高潮太爽了在线观看免费| 国产精品视频免费观看| 亚洲成人在线免费观看| 99re6热视频精品免费观看| 免费成人在线视频观看| 国产无遮挡裸体免费视频在线观看| 人妻免费久久久久久久了| 曰批全过程免费视频观看免费软件| 亚洲精品av无码喷奶水糖心| 亚洲人成网站色在线观看| 国产成人精品亚洲2020| 最新亚洲卡一卡二卡三新区| 亚洲午夜精品久久久久久app| 亚洲一区二区三区深夜天堂| 激情亚洲一区国产精品| jiz zz在亚洲| 色偷偷亚洲第一综合网| 无套内谢孕妇毛片免费看看| 一区二区三区视频免费观看|