数据提交并发控制问题之二(附代码,请高手捉虫),在线献分!

pigherd 2003-04-17 08:46:45
有表A、B、C、D、E,其中A和C、B和D表结构相同,现在要把A中数据转移到C中,B中的数据转移到D中,如果转移成功使E中的一个字段BZ = '1',否则BZ = '0'。

对数据提交的控制一定要严格,一定要做到执行语句后只会出现两种情况:
1.全部转移成功,并且BZ = '1'
2.全部转移失败,并且BZ = '0'

我的写法如下:
LONG BZ_RETURN = 1

//转移A
INSERT INTO C SELECT * FROM A;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
END IF
DELETE FROM A;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
END IF

//转移B
INSERT INTO D SELECT * FROM B;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
END IF
DELETE FROM B;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
END IF

//修改E
IF BZ_RETURN = 0 THEN
UPDATE E SET BZ = '0';
ELSE
UPDATE E SET BZ = '1';
END IF

COMMIT;

IF SQLCA.SQLCODE <> 0 then
messagebox("提示窗","提交数据失败,错误类型为:" + string(SQLCA.SQLCODE) + SQLCA.SQLERRTEXT,EXCLAMATION!)
RETURN
END IF


其实可能这种数据转移的问题大家都处理过,我怀疑自己的写法有问题,请大家捉虫,并请提出好的解决方法!给出正确的写法!
...全文
34 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
andyzq 2003-04-21
  • 打赏
  • 举报
回复
什么算转移成功?转移不成功呢?
pigherd 2003-04-20
  • 打赏
  • 举报
回复
up
pigherd 2003-04-20
  • 打赏
  • 举报
回复
up
pigherd 2003-04-18
  • 打赏
  • 举报
回复
tj_dns(愉快的登山者) 和 tchatcha(老刀)
改的对!

andyzq(小强): 你的做法好处是什么?
andyzq 2003-04-18
  • 打赏
  • 举报
回复
创建临时表,把数据插入到临时表中,处理完以后再把临时表中的数据插回源表中,用存储过程可以很容易实现
tchatcha 2003-04-18
  • 打赏
  • 举报
回复
LONG BZ_RETURN = 1

//转移A
INSERT INTO C SELECT * FROM A;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF
DELETE FROM A;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF

//转移B
INSERT INTO D SELECT * FROM B;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF
DELETE FROM B;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF
COMMIT;
aa:
//修改E
IF BZ_RETURN = 0 THEN
UPDATE E SET BZ = '0';
ELSE
UPDATE E SET BZ = '1';
END IF

COMMIT;

IF SQLCA.SQLCODE <> 0 then
messagebox("提示窗","提交数据失败,错误类型为:" + string(SQLCA.SQLCODE) + SQLCA.SQLERRTEXT,EXCLAMATION!)
RETURN
END IF
pigherd 2003-04-18
  • 打赏
  • 举报
回复
楼上能就上述问题编码举个例么?一定给分!
andyzq 2003-04-18
  • 打赏
  • 举报
回复
效率高,封装性好
joachern 2003-04-18
  • 打赏
  • 举报
回复
这种问题不光在代码上,还和数据库的处理有一定的关系,而要实现具体的功能,代码要绝对。建议创建临时表。
th820901 2003-04-18
  • 打赏
  • 举报
回复
学习来了....
愉快的登山者 2003-04-17
  • 打赏
  • 举报
回复
rollback后,没有必要再继续做下去了.应直接返回
LONG BZ_RETURN = 1

//转移A
INSERT INTO C SELECT * FROM A;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF
DELETE FROM A;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF

//转移B
INSERT INTO D SELECT * FROM B;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF
DELETE FROM B;
IF SQLCA.SQLCODE <> 0 THEN
ROLLBACK;
BZ_RETURN = 0
goto aa:
END IF
COMMIT;
aa:
//修改E
IF BZ_RETURN = 0 THEN
UPDATE E SET BZ = '0';
ELSE
UPDATE E SET BZ = '1';
END IF

COMMIT;

IF SQLCA.SQLCODE <> 0 then
messagebox("提示窗","提交数据失败,错误类型为:" + string(SQLCA.SQLCODE) + SQLCA.SQLERRTEXT,EXCLAMATION!)
RETURN
END IF


pigherd 2003-04-17
  • 打赏
  • 举报
回复
先不说数据量的问题,肯定使用sql语句来的快啊!
关键是数据提交的完整性如何得到保障!
bomber2001 2003-04-17
  • 打赏
  • 举报
回复
这样不好吧!最好在

if then框架内写
girlyz1999 2003-04-17
  • 打赏
  • 举报
回复
另一种方法:
在一个窗口中建立dw_1指向表A,dw_2指向表C
用数据窗口dw_1把A表Retrieve()出来,然后再逐行rowscopy()到dw_2,
如果没有问题就update().
B和D方法相同,如果你想在一个窗口中实现的话!

1,108

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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