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!)