您的位置:首页 > 其它

JDBC调用带输出参数的存储过程

2011-08-22 22:32 387 查看


前段时间项目中遇到存储过程分页的问题,因为分页的时候要统计分页数据的总数,在存储过程中想到了使用一个输出参数,但刚开是出现了点小问题

callableStatement.setString(1,"w");
callableStatement.registerOutParameter(2,java.sql.Types.INTEGER);
ResultSetrs=callableStatement.executeQuery();
intout=callableStatement.getInt(2);
while(rs.next()){
System.out.println(rs.getObject("PERSON_NAME"));
}


如果先调用intout=callableStatement.getInt(2);的话,结果集就会被关闭,并抛出

Exceptioninthread"main"com.microsoft.sqlserver.jdbc.SQLServerException:结果集已关闭。
atcom.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(UnknownSource)
atcom.microsoft.sqlserver.jdbc.SQLServerResultSet.checkClosed(UnknownSource)
atcom.microsoft.sqlserver.jdbc.SQLServerResultSet.next(UnknownSource)
atcom.mchange.v2.c3p0.impl.NewProxyResultSet.next(NewProxyResultSet.java:2859)
atxx.qq.app.AppTest.main(AppTest.java:24)


异常

改为

ResultSetrs=callableStatement.executeQuery();

while(rs.next()){
System.out.println(rs.getObject("PERSON_NAME"));
}
intout=callableStatement.getInt(2);



这样就OK了

附上简单的存储过程及源码

packagexx.qq.app;

importjava.sql.CallableStatement;
importjava.sql.Connection;
importjava.sql.ResultSet;
importorg.springframework.beans.factory.BeanFactory;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
importcom.mchange.v2.c3p0.ComboPooledDataSource;
/**
*@authorJackZhang
* Email:fish2-2@163.com
*@date2011-08-22
*/
publicclassAppTest{
publicstaticvoidmain(String[]args)throwsException{
ApplicationContextcontext=newClassPathXmlApplicationContext(
newString[]{"applicationContext.xml"});
BeanFactoryfactory=(BeanFactory)context;
ComboPooledDataSourcedataSource=(ComboPooledDataSource)factory
.getBean("dataSource");
Connectioncon=dataSource.getConnection();
CallableStatementcallableStatement=con
.prepareCall("{callGetBasics(?,?)}");
callableStatement.setString(1,"w");
callableStatement.registerOutParameter(2,java.sql.Types.INTEGER);
ResultSetrs=callableStatement.executeQuery();

while(rs.next()){
System.out.println(rs.getObject("PERSON_NAME"));
}
intout=callableStatement.getInt(2);
//intout=callableStatement.getInt(2);
System.out.println(out);
if(rs!=null)
rs.close();
if(callableStatement!=null)
callableStatement.close();
if(con!=null)
con.close();
}
}
/**
*
*QueryTemplatequeryTemplate=(QueryTemplate)factory.getBean("queryTemplate");//
*queryTemplate.query(newQuery(){//publicvoidexecuteQuery(Connectioncon,
*Statementst,ResultSetrs)throwsException{//Stringsql="SELECT*FROM
*P_BASIC";//rs=st.executeQuery(sql);//while(rs.next())//{//
*System.out.println(rs.getObject(5));//}//}//});
*
*/

存储过程



ALTERPROCEDUREGetBasics(
@PERSON_NAMEVARCHAR(32),
@COUNTINTOUT
)
AS
BEGIN
SELECT@COUNT=COUNT(*)FROMP_BASIC;
SELECT*FROMP_BASIC
END
GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: