`
fly533
  • 浏览: 107873 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

java 调用SqlServer分页存储过程的,返回多个结果集

    博客分类:
  • java
阅读更多
java 调用存储过程:
package test;

import java.sql.*;

public class Study3 {
	private Connection con;
	public ResultSet rs;
	private CallableStatement callsta;
	private String use = "sa";
	private String pwd = "sa";

	public Study3() {
		try {
			// 连接数据库驱动
			Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
			String str = "jdbc:microsoft:sqlserver://localhost:1433;databasename=test";
			con = DriverManager.getConnection(str, use, pwd);

			// 设置存储过程参数
			String st = "{call Paging(?,?,?)}";
			callsta = con.prepareCall(st);
			callsta.setString(1, "select * from T_employee");
			callsta.setInt(2, 1);
			callsta.setInt(3, 3);

			// 循环输出调用存储过程的记录结果
			StringBuffer sb=new StringBuffer();
			int rsNum=0;//统计结果集的数量
			int updateCount = -1;
			boolean flag = callsta.execute();// 这个而尔值只说明第一个返回内容是更新计数还是结果集。
			do {
				updateCount = callsta.getUpdateCount();
				if (updateCount != -1) {// 说明当前行是一个更新计数
					// 处理.
					System.out.println("..说明当前行是一个更新计数..");
					callsta.getMoreResults();
					continue;// 已经是更新计数了,处理完成后应该移动到下一行
					// 不再判断是否是ResultSet
				}
				rs = callsta.getResultSet();
				if (rs != null) {// 如果到了这里,说明updateCount == -1
					// 处理rs
					rsNum++;
					System.out.println("统计结果集的数量:"+rsNum);
					if (rs != null) {
						ResultSetMetaData rsmd = rs.getMetaData(); // 获取字段名
						int numberOfColumns = rsmd.getColumnCount(); // 获取字段数
						int i = 0;
						while (rs.next()) { // 将查询结果取出
							for (i = 1; i <= numberOfColumns; i++) {
//								System.out.println(rs.getInt("总页数"));
								String date = rs.getString(i);
								sb.append(date+" ");
							}
						}
						rs.close();
					}
					callsta.getMoreResults();
					continue;
					// 是结果集,处理完成后应该移动到下一行
				}
				// 如果到了这里,说明updateCount == -1 && rs == null,什么也没的了
				System.out.println(sb.toString());
			} while (!(updateCount == -1 && rs == null));
			// callsta.getXXX(int);//获取输出参数
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] age) {
		Study3 study = new Study3();
	}
}


存储过程:
USE [Db_8za8za_2] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Description:    <Description,,通用分页存储过程> 
-- ============================================= 
ALTER PROCEDURE [dbo].[paging ] 
    -- Add the parameters for the stored procedure here 
    --传入参数 
    @SqlStr nvarchar(4000), --查询字符串 
    @CurrentPage int, --第N页(当前页数) 
    @PageSize int --每页行数 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    --定义变量 
    DECLARE @CursorId int --CursorId是游标的id 
    DECLARE @Rowcount int --总记录(行)数 
    DECLARE @pageCount int --总页数 
    -- Insert statements for procedure here 
    
    EXEC sp_cursoropen @CursorId output,@SqlStr, 
        @Scrollopt=1,@Ccopt=1,@Rowcount=@Rowcount OUTPUT 
    
    SET @pageCount=CEILING(1.0*@Rowcount/@PageSize)--设置总页数 
    
    SELECT @pageCount 
        AS 总页数,@Rowcount AS 总行数,@CurrentPage AS 当前页 --提示页数 

    IF(@CurrentPage>@pageCount)--如果传入的当前页码大入总页码数则把当前页数设为最后一页 
        BEGIN 
            SET @CurrentPage = @pageCount--设置当前页码数 
        END 
    IF(@CurrentPage<=0)--如果传入的当前页码大入总页码数则把当前页数设为第一页 
        BEGIN 
            SET @CurrentPage = 1--设置当前页码数 
        END 
    SET @CurrentPage=(@CurrentPage-1)*@PageSize+1 --设置当前页码数 

    EXEC sp_cursorfetch @CursorId,16,@CurrentPage,@PageSize 
    EXEC sp_cursorclose @CursorId    --关闭游标 

    SET NOCOUNT OFF 
END
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java jdk实列宝典 光盘源代码

    调用存储过程,StorageProcedure.java; 一个数据库连接池,JDBCInfo.java; 15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java...

    java面试宝典

    42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以...

    Java面试宝典-经典

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    Java面试宝典2010版

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    AutoCode代码生成器(JAVA版)

    如果您是经常使用Hibernate或其他插件的java开发人员,一定会为Hibernate或其他插件的配置部署问题而搞懵,这些类型的插件有个最大的问题是其核心操作均是由该插件的内部完成,对开发人员来说是个黑匣子(一般用户...

    autocode中文java版

    如果您是经常使用Hibernate或其他插件的java开发人员,一定会为Hibernate或其他插件的配置部署问题而搞懵,这些类型的插件有个最大的问题是其核心操作均是由该插件的内部完成,对开发人员来说是个黑匣子(一般用户...

    java面试题大全(2012版)

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    Java面试宝典2020修订版V1.0.1.doc

    35、MySQL、SqlServer、oracle写出字符存储、字符串转时间 52 36、update语句可以修改结果集中的数据吗? 53 37、oracle如何设置主键自动增长? 53 38、表连接、子查询的区别是什么?它们可以相互转化吗?你倾向于用...

    最新Java面试宝典pdf版

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    Java面试笔试资料大全

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    java面试宝典2012

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 8 2、Java有没有goto? 8 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    JAVA面试宝典2010

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 8 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

Global site tag (gtag.js) - Google Analytics