CallableStatement调用sql server存储过程的问题(是个技术问题啊,怎么解决啊?)

时间:2022-01-21 06:09:41
java程序是这样的:
...     
 CallableStatement toesUp = null;
      toesUp= conn.prepareCall("{call pagination(?,?,?,?,?,?) }");
      toesUp.setString(1,strPerpagenumber);
      toesUp.setString(2,strPagenumber);
      toesUp.setString(3,strTablename);
      toesUp.setString(4,strOrderby);
      toesUp.setString(5,strSqlCondition);
      toesUp.registerOutParameter(6,java.sql.Types.VARCHAR);
try
{
toesUp.execute();
ResultSet rs = (ResultSet) toesUp.getResultSet();
strTotalresult=toesUp.getString(6);
ResultSetMetaData rsmd = null;
...
}

SQL SERVER的存储过程是这样的
...
create       procedure pagination 
  @perpagenumber varchar(10)='20',
  @pagenumber    varchar(10)='1',         
  @tablename     varchar(20)='tmp_t_cs_infos_his',      
  @orderby  varchar(200)='order by cust_code,backupdate',
  @sqlcondition  varchar(200)=''
  @totalresult  varchar(200) output
as  
begin
...
select * from tmp_t_cs_infos_his
select @totalresult=count(*) from tmp_t_cs_infos_his
end
我跟踪调试的时候,会发现ResultSet rs = (ResultSet) toesUp.getResultSet()的rs为NULL值,但存储过程的返回参数的值能取到,不是空的。请高手帮帮忙啊
如果我去掉“存储过程的返回参数”就OK了,存储过程的返回的记录集就能取到(rs就不为空了)请问是什么原因啊?有解决的方法吗?

13 个解决方案

#1


请各位高手帮忙看看啊 诊断一下下啊

#2


我也遇到过,后来是用别方法解决的

#3


难道就没有办法了吗?

#4


试试这个:CallableStatement cstmt = Conn.prepareCall  (SQL,java.sql.ResultSet.TYPE_SCROLL_SENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);

ResultSet rs = cstmt.executeQuery();

#5


结果还是不行啊

#6


哪位仁兄知道解决这个问题啊?

#7


没人解决啊 真是那么难吗?

#8


sql server中具体我不知道,我用oracle的时候我是让他直接返回的是结果集合,页就是游标,这样一切ok!

#9


我今天也遇到这个问题了,我看了一下,主要是从存储过程中返回记录集后,再取存储过程返回值后,ResultSet会自动close,CallableStatement里有个KEEP_RESULTSET_OPEN参数,是static int的,帮助上写该参数的意思是可以保持ResultSet为open状态,但我也不知道怎么用。我所知道的就这么多了,若你找到答案后希望你也发条短消息给我,我也被这个问题困扰

#10


把过程中的结果集放到一个游标中,返回一个游标没问题了。
然后调用过程可以了。

#11


结果集怎么放到游标中?楼上的能否给多点提示?

#12


等你的记录集的值抓完之后再取输出的参数就可以了!

我已经测试通过!
try
{
toesUp.execute();
ResultSet rs = (ResultSet) toesUp.getResultSet();
while(rs.next()) {
......
}
strTotalresult=toesUp.getString(6);
...
}

#13


关注中………………

#1


请各位高手帮忙看看啊 诊断一下下啊

#2


我也遇到过,后来是用别方法解决的

#3


难道就没有办法了吗?

#4


试试这个:CallableStatement cstmt = Conn.prepareCall  (SQL,java.sql.ResultSet.TYPE_SCROLL_SENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);

ResultSet rs = cstmt.executeQuery();

#5


结果还是不行啊

#6


哪位仁兄知道解决这个问题啊?

#7


没人解决啊 真是那么难吗?

#8


sql server中具体我不知道,我用oracle的时候我是让他直接返回的是结果集合,页就是游标,这样一切ok!

#9


我今天也遇到这个问题了,我看了一下,主要是从存储过程中返回记录集后,再取存储过程返回值后,ResultSet会自动close,CallableStatement里有个KEEP_RESULTSET_OPEN参数,是static int的,帮助上写该参数的意思是可以保持ResultSet为open状态,但我也不知道怎么用。我所知道的就这么多了,若你找到答案后希望你也发条短消息给我,我也被这个问题困扰

#10


把过程中的结果集放到一个游标中,返回一个游标没问题了。
然后调用过程可以了。

#11


结果集怎么放到游标中?楼上的能否给多点提示?

#12


等你的记录集的值抓完之后再取输出的参数就可以了!

我已经测试通过!
try
{
toesUp.execute();
ResultSet rs = (ResultSet) toesUp.getResultSet();
while(rs.next()) {
......
}
strTotalresult=toesUp.getString(6);
...
}

#13


关注中………………