小弟在网上找个遍也没找到解决偶这个问题滴方案,写了一天的代码,脑子有点不好使,问题提出,还请大牛们解决,给个方案,先谢过了...环境: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,说明插入了一条数据,但是到查询分析器中查表,又没有数据很是郁闷,牛人帮帮忙....
存储过程大致描述如下:
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,说明插入了一条数据,但是到查询分析器中查表,又没有数据很是郁闷,牛人帮帮忙....
返回也没有用过结果集,只是返回了一个errorcode,int型
CallableStatement proc = currconn.prepareCall("{ ? = call SumDataToP_AcctBanlance(?,?,?,?,?,?)}");
....
proc.execute();
int result = proc.getInt(1);
result=9999
运行结果显示,存储过程执行完了,值都得到了,但是怎么数据库中却还是没有数据!百思不解啊...在查询分析器中执行是有结果的!
你说的有理,不是我的事务没有提交,是jdbc没有自动提交,现在终于搞好了!原因是这样,虽然自己在存储过程中写了commit,在查询分析器中执行也有结果这都没错,但是该死的jdbc不会自动给我提交事务,所以当我获取执行后的结果以后,虽然是有1行数据受到影响,但紧接着jdbc就给我回滚了,所以怎么查数据也没有记录进去!
解决方案是:
conn.setAutoCommit(false);
......
conn.commit(); //一定要手动提交哎!搞了二天,终于搞好了,原来是这个问题!
不过现在还有点疑惑,既然是jdbc提交,那存储过程里面的commit不是一点用处都没有?从这个例子来看,就算是存储过程中commit提交了,jdbc照样能把你提交的数据再回滚,我晕!