当前位置: 代码迷 >> PB >> pb中sql语句的使用解决方案
  详细解决方案

pb中sql语句的使用解决方案

热度:14   发布时间:2016-04-29 08:45:07.0
pb中sql语句的使用
写法一:
DELETE FROM 表1;
DELETE FROM 表2;
IF SQLcode <> 1 THEN 
  ROLLBACK;
  MessageBox("","error")
  RETURN
ELSE
  COMMIT;
END IF

写法二:
DELETE FROM 表1;
IF sqlca.SQLcode <> 1 THEN 
  ROLLBACK;
  MessageBox("","error")
  RETURN
ELSE
  COMMIT;
END IF

DELETE FROM 表2;
IF sqlca.SQLcode <> 1 THEN 
  ROLLBACK;
  MessageBox("","error")
  RETURN
ELSE
  COMMIT;
END IF

写法一这样会不会有问题?写法二是没问题的。


------解决方案--------------------
写法一这样会不会有问题?

有.

此时的
SQLcode只针对第二句
DELETE FROM 表2; 
起作用.
------解决方案--------------------
写法一:执行后,第一个delete语句是否成功不清楚,因你判断的是第二个delete语句
写法二:你这个两个delete语句都执行了判断,但有可能只执行了其中一个delete语句

总结:sqlca.SQLcode 判断的是最近一个的SQL语句的执行情况。
如果你要两个SQL语句作为一个事务来处理的话,要写成这样的
delete from tablea;
if sqlca.sqlcode=0 then
delete from tableb;
if sqlca.sqlcode=0 then
commit;
else
rollback;
end if
 else
rollback;
end if
这样两个语句要么一起提交,要么一起回滚
------解决方案--------------------
sqlcode 返回的是最近一次sql执行的 code值 

写法二也有点问题吧 ,如果第二个表出错了 ,第一个已经提交了 ,不满足同是提交 ,同是回滚
------解决方案--------------------
写法一:只判断了最后一句,第一句成功没有不知道,所以不可取
写法二:第一句成功就提交了,如果第二句失败,不能实现统一回滚。需要根据需求明确是否保留第一句里的ELSE 
COMMIT; 

另外,sqlcode<>1错误,一般是sqlcode=0 orsqlcode=100 按成功处理,其他按失败处理
------解决方案--------------------
探讨
每个语句都需要判断sqlcode的值呀
  相关解决方案