SQL2000+PB 当代码执生到dw_1.update() = 1 时数据已保存到表中,再执行sqlca.sqlcode都是= -1?

wjmsino 2004-10-10 08:48:43
为什么dw_1.update() = 1执行后数据就会保存并提交呢?实际还没有执行commit语句
请高手指点!
...全文
503 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjmsino 2004-10-11
  • 打赏
  • 举报
回复
这个没保存是因为第一次失败后rollback了

关键是只要用到这个语句select getdate() into :ldt_sysdate from syscolumns;就出问题
sqlca.sqlcode = -1 sqlca.sqlerrtext 还是那句select returned more than one row

我这个保存哪来的more than one row?
wjmsino 2004-10-11
  • 打赏
  • 举报
回复
就是执行了commit也没有把数据保存进去,这是什么原因呢?
sam7701 2004-10-11
  • 打赏
  • 举报
回复
再加一行
commit ;
wjmsino 2004-10-11
  • 打赏
  • 举报
回复
已解决部分问题,
我在数据窗口的rowfocuschanged事件用了个这个语句:
select getdate() into :ldt_sysdate from syscolumns;
导至保存数据窗口数据时第一次失败,也就是update() = 1 但sqlca.sqlcode = -1
sqlca.sqlerrtext 还是那句select returned mort than one row

但是我点第二次就可以保存成功了。

另外我把select getdate() into :ldt_sysdate from syscolumns;这句注释掉就什么问题都没有了
lzheng2001 2004-10-11
  • 打赏
  • 举报
回复
1. 先看明白Pegasuscc(羽之) 的回复

2.if ..update() = 1 已经可以证明保存成功,我认为没必要还加上 if sqlca.sqlcode = 0 来判断,
一般按以下格式写已经足够了,不需再用sqlcode

if ... update(true,true) = 1 then
commit;
messagebox(...)
else
rollback;
messagebox(...)
end if

另外楼主要注意一般不要用update(true,false)来更新数据(除非特殊情况),第二个参数用false, 数据的更新标志不会被清除,你再执行update()时肯定会出错!
10975037 2004-10-11
  • 打赏
  • 举报
回复
dw_1.update ()=1 是不能把记录保存到数据库中的
------------------------------------------------
1、看看有没有sqlca.aotucommit=.........的字样。把他们削掉。
2、或者sqlca.aotucommit=true ,sqlca.aotucommit=false 加在程序的两边
wjmsino 2004-10-11
  • 打赏
  • 举报
回复
我的保存函数:
SQLCA.AutoCommit = false
IF adw_1.accepttext() = 1 THEN

// MessageBox("系统提示1",sqlca.sqlnrows)and SQLCA.SQLNRows > 0
IF adw_1.update(true,true) = 1 THEN
IF Sqlca.Sqlcode = 0 THEN
IF trim(as_msg1) = '' THEN
ELSE
COMMIT USING sqlca;
messagebox("系统提示",as_msg1,Information! ,OK!)
END IF
RETURN 1
ELSE
IF Trim(as_msg2) = '' THEN
ELSE
ROLLBACK USING sqlca;
MessageBox("系统提示1",as_msg2,Information! ,OK!)
END IF
RETURN -1
END IF
ELSE
ROLLBACK USING sqlca;
IF trim(as_msg2) = '' THEN
ELSE
messagebox("系统提示2",as_msg2,Information! ,OK!)
END IF
RETURN -1
END IF
END IF
RETURN -1

第一次点保存还是失败的,第二次是成功的。
再当adw_1.update(true,true)时,虽然保存成功,但修改的数据并未被保存。
而当改为adw_1.update(true,false)时,第一次点保存还是失败的,第二次是成功的。数据已被保存但第三次点击就报Row changed between retrieve and update.No changes made to database.这个错

我看到保存的数据是在数据库里查的。
wangxichen 2004-10-11
  • 打赏
  • 举报
回复
看你数据库的提交方式,如果是自动提交,就不必commit的
lzheng2001 2004-10-11
  • 打赏
  • 举报
回复
楼主这句的目的是想获得服务器的系统时间吗? 为什么要放到rowfoucuschanged 事件中?
lzheng2001 2004-10-11
  • 打赏
  • 举报
回复
那就试试
select top 1 getdate() into ....;

Pegasuscc 2004-10-10
  • 打赏
  • 举报
回复
楼主,你的题目和你的内容不符啊。如果说你UPDATE后,看表数据就更改了,这很正常,因为对于当前用户来讲,数据是已经更改了,其实你看到的是BUFFER的内容,别的用户看到的还是未更改的,你要提交后,其他用户才能看到更改数据。
mittee 2004-10-10
  • 打赏
  • 举报
回复
dw_1.update() = 1执行后数据就会自动保存并提交??
那还用事务管理干什么?
zhouweiwansui 2004-10-10
  • 打赏
  • 举报
回复
你应该设置sqlca.autocommit=false
那么update以后的数据就不会自动提交了.

609

社区成员

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

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