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

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

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

    我是FE,也是Fe

    前端來源于不斷的點滴積累。我一直在努力。

    統計

    留言簿(15)

    閱讀排行榜

    評論排行榜

    Sql server 2000 jdbc 查詢分頁解決方案

    (今天看自己的blog,發現上次更新已經是3-20,堅持每周更新blog! )

    之所以要把sql server 2000 jdbc 分頁單獨來說說,又兩個地方還是值得一提,一者是sql server 2000要實現數據庫分頁是比較麻煩的事情。二者是jdbc查詢出多個ResultSet 的取法。

    先在項目的classpath中添加msbase.jar,mssqlserver.jar,msutil.jar 怎么來的就不多廢話了。需要說的是我最先用的sql server 2005 jdbc驅動sqljdbc.jar放到項目中,后來的程序是報錯的。回頭想想,報錯有理,sql server 2005 已經支持rownum 分頁了。

    先說說sql server 2000的分頁的實現,目前實現方法大概是那三種。我個人還是喜歡使用存儲過程,原因是使用非常方便,至于使用的存儲過程,這里還是放出來看看,估計大家用的都大同小異。

    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, --第頁記錄條數  
    @pagesize   int --每頁顯示記錄 
    as   
    set   nocount   on   
    declare   @P1   int, --P1是游標的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

    這個存儲過程的實現,使用了三個系統存儲過程sp_cursoropen ,sp_cursorfetch ,sp_cursorclose 從字面上的意思大概是他叫結果集使用游標打開,然后讀取其中的@pageSize條記錄,所以單從查詢上來講,性能是不及使用select top 之類的實現。

     

    使用起來非常容易,exec Pr_QueryByPage 'select * from yourtable',1,10  就可以了麻煩的是他返回的是三張表。第一張表是查詢的表,但是沒有記錄。第二個表一行兩列,第一個列是總頁數,第二個列是總記錄條數。第三張表才是需要的數據。這就造成了取的時候有點小麻煩,因為之前只知道,在.net中可以直接fill(DataSet),然后DataSet里面可取DataTable。但是在jdbc里面我映像中ResultSet 只能容一張表。后來找了一些資料,原來PreparedStatement,CallableStatement,Statement都支持查詢返回多個ResultSet ,好了,非常好。 下面是我使用CallableStatemnt取到的結果集。

     

    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
                        }
                    }
                }

    這樣就實現了分頁,網上很多人測試了,這個方法的性能不及別的方法,這里我要指出的是,別的方法是不能返回總的記錄條數的。而要知道總的記錄條數,通常需要select count(*) from ( your sql) 這兩次查詢叫起來的時間未必會少。

    總結

    使用上述方法實現sql server 2000 jdbc 分頁,使用方便,性能還說的過去。我不知道sql server 2005 的查詢性能是否又提升。

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

    評論

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

    2005 性能比較高點   回復  更多評論   

    主站蜘蛛池模板: 亚洲xxxx视频| 亚洲欧洲精品视频在线观看| 亚洲高清毛片一区二区| 韩国免费一级成人毛片| 亚洲精彩视频在线观看| 100000免费啪啪18免进| 亚洲三级高清免费| 啦啦啦www免费视频| 亚洲欧美日韩国产成人| 日本高清免费aaaaa大片视频| 亚洲精品国产suv一区88 | 香蕉视频亚洲一级| 成年女人18级毛片毛片免费观看| 亚洲午夜在线播放| 国产精品国产午夜免费福利看 | 大妹子影视剧在线观看全集免费| 亚洲成AV人在线观看网址| 四虎影视永久在线精品免费| 亚洲人成人无码网www国产| 国产精品hd免费观看| 亚洲国产精品无码久久一线| 24小时日本电影免费看| 亚洲 欧洲 自拍 另类 校园| yy6080亚洲一级理论| 国产色无码精品视频免费| 亚洲成人黄色在线| 大胆亚洲人体视频| 一级毛片免费观看不卡视频| 亚洲一区二区三区高清视频| 日韩中文无码有码免费视频| 美国免费高清一级毛片| 亚洲va久久久噜噜噜久久| 91在线视频免费看| 一个人看的www免费在线视频| 亚洲ⅴ国产v天堂a无码二区| 最近最新MV在线观看免费高清| 亚洲av无码有乱码在线观看| 国产亚洲福利精品一区二区| 亚洲国产成人片在线观看无码 | 亚洲资源在线观看| 久久久久国色AV免费看图片|