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

2016-02-19 13:50 4 1 收藏

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

【 tulaoshi.com - 编程语言 】

  之所以要把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 之类的实现。

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

  使用起来非常容易,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) 这两次查询叫起来的时间未必会少。

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

  总结

  使用上述方法实现sql server 2000 jdbc 分页,使用方便,性能还说的过去。我不知道sql server 2005 的查询性能是否又提升。

来源:http://www.tulaoshi.com/n/20160219/1605355.html

延伸阅读
标签: SQLServer
第一个支持唯一主键,第二支持多主键,测试过,效率一般 CREATE PROC P_viewPage     /*         no_mIss 分页存储过程 2007.2.20  QQ:34813284         适用于单一主键或存在唯一值列的表或视图        &...
标签: Web开发
情况一:针对页面上少量元素不打印(不预览)的情况的解决办法是使用style,具体如下: 定义如下style: @media print { .notprint { display:none; } } @media screen { .notprint { display:inline; cursor:hand; } } 所有需要显示但不需要打印(预览)的元素都加上: class='notprint' 情况二:针对只打印(预览)页...
数据库操作现在是项目开发的根本,学习Java首先应该学会怎么样连接数据库,用Java连接数据库可不像用Delphi这类工具那样设几个属性就OK,说简单也简单,说复杂,其实也挺复杂的,而且很麻烦,如果是初学,根本不能保证第一次就连接成功,下面以SQL Server 2000为例,说说Java连接数据库的基本方法,也记录一下心得。 1、下载SQL Server 2000 ...
标签: SQLServer
if exists(select name from sysobjects where name='GetRecord' and type = 'p')    drop procedure GetRecord GO create procedure GetRecord @id int output,              --输出p_id和p_path @path nvarchar(255) output as select top 1 @id = p_id, @path ...
标签: SQLServer
  在开发分布式数据库软件时,经常碰到下面的错误: 服务器: 消息 7391,级别 16,状态 1,行 6 该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分 布式事务。 [OLE/DB provider returned message: 不能在指定的事务处理器中 获得新事务。] ----------------------------------------- 服务器: 消息 8520,级别 20,状态 1,...

经验教程

370

收藏

62
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部