我是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 衡鋒 閱讀(1681) 評論(1)  編輯  收藏 所屬分類: j2ee

          評論

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

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

          主站蜘蛛池模板: 湖北省| 苗栗市| 饶河县| 牡丹江市| 蚌埠市| 靖西县| 石渠县| 斗六市| 毕节市| 双辽市| 托克托县| 凌源市| 澜沧| 辛集市| 玛纳斯县| 平邑县| 尉氏县| 鹿泉市| 桂平市| 肥东县| 肃南| 德兴市| 汉中市| 铜陵市| 乐陵市| 西林县| 美姑县| 大兴区| 新邵县| 陈巴尔虎旗| 禄丰县| 岫岩| 滦平县| 蕲春县| 堆龙德庆县| 香河县| 手游| 江安县| 株洲县| 宜兴市| 孙吴县|