首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > PB >

pb对事务处理?该如何解决

2013-09-08 
pb对事务处理?pb中事务处理的问题?对一组SQL语句要么都执行成功,要么都不执行。举例:INSERT INTO TABLEA (F

pb对事务处理?
pb中事务处理的问题?
对一组SQL语句要么都执行成功,要么都不执行。
举例:
   INSERT INTO TABLEA (F1) VALUES(V1);
   INSERT INTO TABLEB (F1) VALUES(V1);
执行上面两条语句。
怎么做事务处理啊。
由于SQLCA.SQLCODE是判断最后执行语句的返回状态,
如果
    INSERT INTO TABLEA (F1) VALUES(V1);//-----语句1
    INSERT INTO TABLEB (F1) VALUES(V1);//-----语句2
    if  sqlca.sqlcode = 0 then
        commit;                        
    else
        rollback;
    end if
执行后,如果语句1不成功,语句2成功,程序照样会返回sqlca.sqlcode = 0
,然后会执行commit;

这不是所需要的,系统要么都不写数据成功,要么都写进去
显然,如果语句2执行失败后,程序返回sqlca.sqlcode = -1 ,执行rollback回滚,
取消所有的操作。
但是实际上,并不是语句2才会执行失败,任何sql语句执行都有可能执行失败的。

不可能每个语句都判断一下吧?还有一种办法,就是每执行一条sql,把sqlcode赋个变量,最后变量相加判断是否为0,为0的就commit,<0就rollback
现在提出问题,还有没有其他更好的方法??????????? 
[解决办法]
每个语句都需要判断,出错后,就回滚事务,结束程序,最后如果没有错误,就提交。
string ls_err
INSERT INTO TABLEA (F1) VALUES(V1);//-----语句1
if sqlca.sqlcode<>0 then
   ls_err=sqlca.sqlerrtext
   rollback;
   messagebox("提示",ls_err)
   return
end if
INSERT INTO TABLEB (F1) VALUES(V1);//-----语句2
if sqlca.sqlcode<>0 then
   ls_err=sqlca.sqlerrtext
   rollback;
   messagebox("提示",ls_err)
   return
end if

commit;
[解决办法]
顶楼上,最好在最前面加上sqlca.autocommit=false;
然后在所有语句执行完后,再sqlca.autocommit=true;
中间每句话都需要判断。
[解决办法]
begin transaction

  INSERT INTO TABLEA (F1) VALUES(V1);//-----语句1
  INSERT INTO TABLEB (F1) VALUES(V1);//-----语句2
  
  if sqlca.sqlcode = 0 then


      commit transaction;   
  else
      rollback transaction;
  end if




end transaction
[解决办法]


sqlca.autocommit = false

insert into tablea(f1) value(v1) using sqlca;
if sqlca.sqlcode <> 0 goto lb_error

insert into tableb(f1) value(v1) using sqlca;
if sqlca.sqlcode <> 0 goto lb_error

....... //这里还可以写很多 sql 语句,反正就是每条后写 if sqlca.sqlcode <> 0 goto lb_error

commit using sqlca;
messagebox('提示', '数据存储完毕! ')
return


lb_error:
string ls_errtext 
ls_errtext = sqlca.sqlerrtext
rollback using sqlca;
messagebox('错误', ls_errtext, stopsign!)


热点排行