关于dw.update后自增主键自动刷值的问题

halenwyh 2012-09-14 05:45:43
情况如下:有个dw,update属性中设置为:where clause -- key columns; key modification -- use update; unique key column 指定为对应的主键;identity column 也指定为对应的主键。该主键在sqlserver数据库中是自增列。

出现在问题如下:
第一次调用保存事件时,主表保存成功,得到的 ll_docid 为1,但后面代码中子表保存失败回滚了,当前窗口不关,用户再次点击保存按钮调用保存事件时,主表保存成功后得到的 ll_docid 仍旧为1,而实际该id为2。
怎么实现 rollback 后,再update时,得到新的自增列 id ?

请求各位高手指教

/////////////////////////////////////////////////////////////
代码如下:ue_save()事件中
l_return = dw_1.update(true,false)
IF ll_return = -1 THEN //主表保存失败回滚
ROLLBACK Using sqlca;
RETURN -1
END IF

ll_docid = dw_1.object.docid[dw_1.getrow()]

for i = 1 to dw_2.rowcount()
dw_2.object.docid[i] = ll_docid
next

l_return = dw_2.update(true,false)
IF ll_return = -1 THEN //子表保存失败回滚
ROLLBACK Using sqlca;
RETURN -1
ELSE
COMMIT;
dw_1.resetupdate()
dw_2.resetupdate()
return 1
END IF
///////////////////////////////////////////////////

...全文
433 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
halenwyh 2013-08-01
  • 打赏
  • 举报
回复
结贴,来写一下我自己最后的解决办法,在每次 dw1.update() 之前,先判断一下当前是不是新增,如果是,就给 dw1 的 identity 字段赋予 null, 这样 update() 以后,就能获取实际保存的id
halenwyh 2012-09-24
  • 打赏
  • 举报
回复
TO:wag_enu
我照这样设置的,还是不行,第一次保存时自增值可以取得,回滚后再次保存还是取得第一次的值
wag_enu 2012-09-21
  • 打赏
  • 举报
回复
halenwyh 2012-09-21
  • 打赏
  • 举报
回复
TO:wag_enu
请问你是怎么设置的呢?
halenwyh 2012-09-19
  • 打赏
  • 举报
回复
感谢楼上各位的回答。
TO:wag_enu
我的设置确实是 sqlca.autocommit = false

TO:sjlion
关于自增值的事,我一再地测试过,程序中执行了update,即使没有commit,sqlserver数据库中的自增值一样会自增,此时如果回滚掉,然后直接到数据库中增加一条记录,你会发现刚才程序中使用过的id会被跳过去

TO:sbks
我按你的方法把 pbobd115.ini 和 pbobd115.dll 都从share中复制了一份到程序目录下,但还是如以前一样,第一次update之后,能够取出自增的主键,但回滚后再次update 仍旧获得第一次的id ,此时我把这个id 赋给 dw_2 的外键字段,dw_2.update() 时就会报外键错误,说明这个id已经被数据库跳过去了,我就是想 dw_1 再次保存时能够得到数据库实际自增的id
wag_enu 2012-09-19
  • 打赏
  • 举报
回复
这个功能我一直在用,PB9 和11.5 都连接过SQL 2000,还没出现过这种情况。
zlf19810306 2012-09-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

楼上几位都理解错了,我没有给dw_1.docid赋值,只是dw_1.update()后取出数据库自增的docid,赋予dw_2的某一列
我现在的问题是第一次对dw_1.update成功后,在没有commit的情况下,能够得到dw_1.docid,注意因后续数据不合法,执行了rollback,此时再次执行 dw_1.update() 后,得到的 dw_1.docid 值没有再自增,而是仍旧得到第……
[/Quote]

如楼主自己所说你第一次update后rollback了,这时自增的列是不会自动增加的,因为你的事务回滚了。虽然update之后,数据库表里是插入了你update的数据,但是要事务提交才是真正的更新了表。
sjlion 2012-09-17
  • 打赏
  • 举报
回复
十分的不明白。
看你的代码和描述,你的id取自数据窗口,你连续在当前数据窗口取值,当然没有变化。即使第一次的1,也是你在数据窗口中取得的。即使抛开前端从数据库方面来说,你第一次是回滚了的,第二次保存时,1都没有,哪里来的2呢?
sbks 2012-09-17
  • 打赏
  • 举报
回复
需要pbobdxxx.ini(share目录下,xxx是版本号)这个文件在系统目录或程序目录下,dw才可以自动刷新identity
halenwyh 2012-09-16
  • 打赏
  • 举报
回复
楼上几位都理解错了,我没有给dw_1.docid赋值,只是dw_1.update()后取出数据库自增的docid,赋予dw_2的某一列
我现在的问题是第一次对dw_1.update成功后,在没有commit的情况下,能够得到dw_1.docid,注意因后续数据不合法,执行了rollback,此时再次执行 dw_1.update() 后,得到的 dw_1.docid 值没有再自增,而是仍旧得到第一次的值,这个问题怎么解决?
wag_enu 2012-09-16
  • 打赏
  • 举报
回复
sqlca.autocommit = false //检查一下这项,应该为false。
wag_enu 2012-09-15
  • 打赏
  • 举报
回复


要注意,自增列不能人为的写入处理,只能由系统自动处理。
网络橘子 2012-09-15
  • 打赏
  • 举报
回复
1楼正解
zlf19810306 2012-09-14
  • 打赏
  • 举报
回复
identity column 在upadte的时候是不更新的,由数据库自己生成,也就是说这个列无论你怎么赋值都不会写到数据库里

611

社区成员

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

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