pb中sql语句的使用

zjf1119 2010-01-08 08:34:02
写法一:
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

写法一这样会不会有问题?写法二是没问题的。
...全文
531 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
chaoleo 2010-01-14
  • 打赏
  • 举报
回复
既然是命令当然要保证命令的完整性,要不然系统怎么来识别?

slyfp 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 pb8 的回复:]
为了保证事务的一致性,这是必须的,不要觉得麻烦~~
如果没有事务控制机制,那才是真正的麻烦~~
[/Quote]
支持痴痴观点。
pb8 2010-01-10
  • 打赏
  • 举报
回复
以前的贴子里面我回过几个关于事务控制的,你可以搜搜看一下,理解事务的概念就不会想着麻烦之类的了~
pb8 2010-01-10
  • 打赏
  • 举报
回复
为了保证事务的一致性,这是必须的,不要觉得麻烦~~
如果没有事务控制机制,那才是真正的麻烦~~
myclife 2010-01-10
  • 打赏
  • 举报
回复
6和13楼异曲同工。
pb8 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 hchjjun 的回复:]
每个语句都需要判断sqlcode的值呀
[/Quote]
每条语句都有可能失败的,对于特严格的系统,还要判断commit是否成功,不过上面的代码只是理论上的演示,具体应用的时候这段代码一般只有一个rollback与commit
hchjjun 2010-01-10
  • 打赏
  • 举报
回复
每个语句都需要判断sqlcode的值呀
zjf1119 2010-01-09
  • 打赏
  • 举报
回复
DELETE FROM 表1;
IF sqlca.SQLcode <> 0 THEN
ROLLBACK;
MessageBox("","error")
RETURN
END IF

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

COMMIT;


这样写应该是可以保证数据的统一性。可是代码多啊,当执行很多事务的时候,每一个sql语句之后都加上一个sql的判断,感觉麻烦。
sun1976 2010-01-08
  • 打赏
  • 举报
回复
写法一:只判断了最后一句,第一句成功没有不知道,所以不可取
写法二:第一句成功就提交了,如果第二句失败,不能实现统一回滚。需要根据需求明确是否保留第一句里的ELSE
COMMIT;

另外,sqlcode<>1错误,一般是sqlcode=0 orsqlcode=100 按成功处理,其他按失败处理
eviler 2010-01-08
  • 打赏
  • 举报
回复
sqlcode 返回的是最近一次sql执行的 code值

写法二也有点问题吧 ,如果第二个表出错了 ,第一个已经提交了 ,不满足同是提交 ,同是回滚
DYFDWX 2010-01-08
  • 打赏
  • 举报
回复
写法一:执行后,第一个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
这样两个语句要么一起提交,要么一起回滚
swallowluo 2010-01-08
  • 打赏
  • 举报
回复
看你自己的需要。
如果你在执行完一条SQL语句之后想判断一下该语句是否执行成功,那么就一定要判断sqlca.sqlcode,而不要等到下一个SQL语句执行后再判断。
如果想把两个SQL语句放在一个事务中,那么执行完第一个SQL语句后,如果成功就不要提交,直到成功执行第二个语句后再提交。
QY_QU 2010-01-08
  • 打赏
  • 举报
回复
如果你在写完多句SQL, 在做 sqlca。sqlcode <> 0, 它将判断最近的一段SQL是否执行成功.
dawugui 2010-01-08
  • 打赏
  • 举报
回复
写法一这样会不会有问题?

有.

此时的
SQLcode只针对第二句
DELETE FROM 表2;
起作用.
zjf1119 2010-01-08
  • 打赏
  • 举报
回复
我想问的不是返回值的问题,那个是我写错了。
我想知道,是不是在执行sql语句之后就一定要立刻添加一个if sqlca。sqlcode <> 0 then 的判断?
可不可以在多句sql语句之后,在来判断的?
zjf1119 2010-01-08
  • 打赏
  • 举报
回复
写法一:
DELETE FROM 表1;
DELETE FROM 表2;
IF SQLcode <> 1 THEN
ROLLBACK;
MessageBox("","error")
RETURN
END IF
COMMIT;


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

DELETE FROM 表2;
IF sqlca.SQLcode <> 0 THEN
ROLLBACK;
MessageBox("","error")
RETURN
ELSE
COMMIT;
END IF
archlwh 2010-01-08
  • 打赏
  • 举报
回复
好早就发帖啊,sqlcode的返回值好像是-1,0,100吧。。没有1吧
builderwfy 2010-01-08
  • 打赏
  • 举报
回复
寫法一肯定有問題了,如果按方法一寫將造成數據不統一
builderwfy 2010-01-08
  • 打赏
  • 举报
回复
對於兩條以上SQL語句,必須用事務來處理,這樣才能保持數據統一
liyanxinhe 2010-01-08
  • 打赏
  • 举报
回复
同意6楼的!

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧