Sql server 2000 jdbc 查询分页解决方案

296351555

296351555

2016-02-19 13:50

今天图老师小编给大家介绍下Sql server 2000 jdbc 查询分页解决方案,平时喜欢Sql server 2000 jdbc 查询分页解决方案的朋友赶紧收藏起来吧!记得点赞哦~

  之所以要把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的分页的实现,目前实现方法大概是那三种。我个人还是喜欢使用存储过程,原因是使用非常方便,至于使用的存储过程,这里还是放出来看看,估计大家用的都大同小异。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  这个存储过程的实现,使用了三个系统存储过程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 的查询性能是否又提升。

展开更多 50%)
分享

猜你喜欢

Sql server 2000 jdbc 查询分页解决方案

编程语言 网络编程
Sql server 2000 jdbc 查询分页解决方案

关于SQL Server SQL语句查询分页数据的解决方案

SQLServer
关于SQL Server SQL语句查询分页数据的解决方案

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

SQL Server2000+JDBC常见问题及解决

SQLServer
SQL Server2000+JDBC常见问题及解决

两台SQL Server数据同步解决方案

SQLServer
两台SQL Server数据同步解决方案

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

SQL孤立用户解决方案

编程语言 网络编程
SQL孤立用户解决方案

使用Microsoft SQL Server 2000的XML查询

SQLServer
使用Microsoft SQL Server 2000的XML查询

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如何解决Windows8无法使用3G上网卡问题

如何解决Windows8无法使用3G上网卡问题

SQLCLR(一)入门

SQLCLR(一)入门
下拉加载更多内容 ↓