小弟在网上找个遍也没找到解决偶这个问题滴方案,写了一天的代码,脑子有点不好使,问题提出,还请大牛们解决,给个方案,先谢过了...环境:java ,sqlserver2000 ,微软标准驱动
存储过程大致描述如下:
CREATE PROCEDURE SumDataToP_AcctBanlance 
  @FillCode_     int,   -- default 205
  @BonusCode_    int,   -- default 218
  @PayCode_      int,   -- default 201
  @ReFundCode_   int,   -- default 202
  @EnCashCode_   int,   -- default 206
  @UnDoCode_     int    -- default 209
AS
 .....
SET @Error_code = 9999  --不出错,就是9999正确的值
 .....
 Begin Transaction --因为下面的处理较多,用到了事务
   ......
   if (@@error....)
     set @error_code = -1 ;
     goto on_error
   .....
  Commit--没错就提交  return @Error_code --返回on_error: --有错就回滚
ROLLBACK TRANSACTION
return @Error_code 存储过程在查询分析器中得到了偶想到的值,即没有返回值,数据库中已经有偶想到的记录了!java调用代码:
      currconn = ScheduleTools.getCurrConnection();
      CallableStatement proc = currconn.prepareCall("{call SumDataToP_AcctBanlance (?,?,?,?,?,?)}");
      proc.setInt(1,205);
      proc.setInt(2,218);
      proc.setInt(3,201); 
      proc.setInt(4,202);
      proc.setInt(5,206);
      proc.setInt(6,209); 
      //记录数据库
      proc.execute(); //call end现在的问题是:
   用proc.execute() 得到了结果是false,数据库中没有插入记录
   用proc.executequery()得到No ResultSet set was produced. 的确,偶存储过程中没有用到结果集
   用executeUpdate()得到的结果为1,说明插入了一条数据,但是到查询分析器中查表,又没有数据很是郁闷,牛人帮帮忙....

解决方案 »

  1.   

    提示一下:偶存储过程中没有用到output值,所以也没有registerOutParameter之类的设置...
    返回也没有用过结果集,只是返回了一个errorcode,int型
      

  2.   

    昨天看了一下说明,少了一个返回参数,因此改成了这样
    CallableStatement proc = currconn.prepareCall("{ ? = call SumDataToP_AcctBanlance(?,?,?,?,?,?)}");
    ....
          proc.execute();
          int result = proc.getInt(1); 
    result=9999
    运行结果显示,存储过程执行完了,值都得到了,但是怎么数据库中却还是没有数据!百思不解啊...在查询分析器中执行是有结果的!
      

  3.   

    To ll42002(灰舌)
    你说的有理,不是我的事务没有提交,是jdbc没有自动提交,现在终于搞好了!原因是这样,虽然自己在存储过程中写了commit,在查询分析器中执行也有结果这都没错,但是该死的jdbc不会自动给我提交事务,所以当我获取执行后的结果以后,虽然是有1行数据受到影响,但紧接着jdbc就给我回滚了,所以怎么查数据也没有记录进去!
    解决方案是:
          conn.setAutoCommit(false);
          ......
          conn.commit(); //一定要手动提交哎!搞了二天,终于搞好了,原来是这个问题!
    不过现在还有点疑惑,既然是jdbc提交,那存储过程里面的commit不是一点用处都没有?从这个例子来看,就算是存储过程中commit提交了,jdbc照样能把你提交的数据再回滚,我晕!
      

  4.   

    是否你在存储过程中用了事务,然后又用JDBC启动了一个事务?那就成了嵌套事务,嵌套事务是件麻烦的事情,一般我还是选择避免。因为在两层的嵌套事务中,第一次回滚会回滚所有,但第一次提交却只是作个标记,到第二次提交才真正提交。如果是这问题,建议看看嵌套各画的问题。