No changes made to database

No changes made to database. 100分求江湖救急啊!!!!!!

楼主jhjjw(巨灵) 2004-10-22 19:53:39 在 PowerBuilder / DataWindow 提问

在并发测试中,弹出如下错误,捕获的sqldbcode=0,sqlerrtext=''。是什么缘因造成的啊?   排除DW的UPDATE属性设置,因为我都试过了。  
          另:数据库ORACLE8.1.7。在测试过程中,生成一条记录,然后保存。一般情况下都能保存成功,哪怕是出错后继续的增加保存。  
          兄弟姐妹们,帮帮忙啊!  
   
   
  No   changes   made   to   database.  
   
  INSERT   INTO   "ZF_LA_DETAIL"   (   "LA_GEN_CODE",   "DJR",   "DJRQ",   "DSR",   "XB",   "NL",   "ZY",   "YZBM",   "DH",   "FZR",   "ZZ",   "AFD",   "AJLY",   "AQ",   "CBR",   "CBRQ",   "CBJGYJ",   "CBJGRQ",   "JLDYJ",   "JLDRQ",   "LXA",   "LAZT",   "SMWJ",   "JZQM",   "AJXZ",   "AJJZ",   "CBJGQM",   "AJXZWFXW",   "AJLX",   "FZYJ",   "FZQM",   "FZRQ"   )   VALUES   (   :1,   :2,   :3,   :4,   :5,   :6,   :7,   :8,   :9,   :10,   :11,   :12,   :13,   :14,   :15,   :16,   :17,   :18,   :19,   :20,   :21,   :22,   :23,   :24,   :25,   :26,   :27,   :28,   :29,   :30,   :31,   :32   )  
   
  问题点数:100、回复次数:14Top

1 楼workhand(我可憨了...)回复于 2004-10-22 20:04:33 得分 60

Rows   changed   between   retrieve   and   update.  
  并发操作出现的问题  
   
  需要退出再做一遍才可以   :)  
  (转贴)  
  PowerBuilder中的并发控制  
   
  PowerBuilder中可以通过数据窗口的更新属性(Update   Properties)来实现并发控制。打开   DataWindow   画笔板,点击   Rows->Update   Properties菜单,进入“Specify   Updatae   Properties”对话框,其中“Where   Clause   for   Update/Delete”组合框中的三个选项就是三种处理数据并发问题的策略。    
   
  1、选项“Key   Columns”:    
   
  这种情况是比较更新前后Table的关键字是否发生了变化,即当前数据库中关键字的实际值和最初查询的值做比较,如果没有改变,则可以更新,反之不能更新。  
   
  如用户A将员工号为100的职员的salary字段值改为1200并保存后,B用户也将员工号为100的职员的salary字段值改为950并点击“存盘”按钮,我们可以看到数据窗口sqlpreview事件中的sqlsyntax返回如:  
   
  UPDATE   "personnel"   SET   "salary"   =   950   WHERE   "id"   =   100    
   
  因为关键字id=100没有发生变化,Where条件成立,更新成功,将A用户的修改覆盖,salary值变为950元,员工损失了200元。显然这样没有达到并发控制的目的,未能保证数据的完整性。  
   
   
   
  2、选项“Key   and   Updateable   Column”:    
   
  这种情况是比较更新前后Table的关键字和可修改(更新)的列值是否发生了变化,如果没有一项发生改变,更新成功;反之,若数据库中当前值中若任一项与数据窗口最初检索出的值不一致,则更新失败。对于此例,因所有字段都是可修改(更新)的,即检测是否有任一字段变化。  
   
  同上,当用户A更新完后,B用户点击“存盘”按钮,我们可以看到sqlsyntax返回如:  
   
  UPDATE   "personnel"   SET   "salary"   =   950   WHERE   "id"   =   100   AND   "name"   =   '令狐冲'   AND   "birthday"   =   '1975-05-01'   AND   "technical_post"   =   '工程师'   AND   "salary"   =   1000   AND   "notes"   =   '软件开发'    
   
  显然,id字段没有改变,而可修改(更新)列之一salary的值经A用户修改存盘后,已由1000变为了当前的1200,where条件不成立,因此更新失败,并弹出出错信息如下:  
   
  Row   changed   between   retrieve   and   update.  
   
  No   changes   made   to   database.  
   
  UPDATE   "personnel"   SET   "salary"   =   950   WHERE   "id"   =   100   AND   "name"   =   '令狐冲'   AND   "birthday"   =   '1975-05-01'   AND   "technical_post"   =   '工程师'   AND   "salary"   =   1000   AND   "notes"   =   '软件开发'    
   
  此时点击《刷新》按钮,我们可以看到,salary的值仍为1200,达到了并发控制的目的,保证数据的完整性。  
   
   
   
  3、选项“Key   and   Modified   Columns”:    
   
  这种情况是比较更新前后Table的关键字和要修改(更新)的列值是否发生了变化,如果没有改变,更新成功,反之更新失败。对于本例,即判断关键字id和将要修改字段salary是否发生变化。  
   
  同上,当用户A更新完后,B用户点击“存盘”按钮,我们可以看到sqlsyntax返回如:  
   
  UPDATE   "personnel"   SET   "salary"   =   950   WHERE   "id"   =   100   AND   "salary"   =   1000    
   
  这里id字段没有改变,而此次将要修改的列salary值已由1000变为了1200,where条件不成立,因此更新失败,并弹出出错信息如下:  
   
  Row   changed   between   retrieve   and   update.  
   
  No   changes   made   to   database.  
   
  UPDATE   "personnel"   SET   "salary"   =   950   WHERE   "id"   =   100   AND   "salary"   =   1000    
   
  此时我们点击《刷新》按钮,我们可以看到,salary的值仍为1200,也达到了并发控制的目的。    
   
   
   
  再举一个例子:  
   
  如果A用户更新的是备注notes字段,而B用户更新的是薪水salary字段,按照业务,这种操作是允许的,而在PB中会如何处理呢?  
   
  1、对于选项“Key   Columns”:   因为关键字没有改变,更新成功。  
   
  2、对于选项“Key   and   Updateable   Column”:    
   
  当用户A更新完后,B用户点击“存盘”按钮,我们可以看到sqlsyntax返回如:  
   
  UPDATE   "personnel"   SET   "salary"   =   950   WHERE   "id"   =   100   AND   "name"   =   '令狐冲'   AND   "birthday"   =   '1975-05-01'   AND   "technical_post"   =   '工程师'   AND   "salary"   =   1000   AND   "notes"   =   '软件开发'    
   
  这里,id字段没有改变,salary字段也没有改变,但可修改(更新)列之一notes的值经A用户的修改,已由“软件开发”变为了“硬件维护”,where条件不成立,因此更新失败,系统将报出错信息。    
   
  此时点击《刷新》按钮,可以看到,salary的值仍为1200,notes的值为“硬件维护”。  
   
   
   
  3、对于选项“Key   and   Modified   Columns”:    
   
  当用户A更新完后,B用户点击“存盘”按钮,我们可以看到sqlsyntax返回如:  
   
  UPDATE   "personnel"   SET   "salary"   =   950   WHERE   "id"   =   100   AND   "salary"   =   1000    
   
  这里,id字段没有改变,而将要修改的列salary值也没有改变(A用户只是修改了notes字段),where条件成立,因此更新成功。    
   
  此时点击《刷新》按钮,可以看到,salary的值为950,notes的值为“硬件维护”。注意这里B用户只是修改salary字段,并不修改notes字段,因此notes保留了A用户修改后的值。  
   
   
   
  从上面例子中我们可以得出如下结论:  
   
  1、“Key   Columns”选项在控制数据完整性方面最弱,它所允许的并发操作是最多的,所禁止的并发操作发生的可能性非常小,只有当主键被更改后才起并发控制作用,当一条记录的关键字改变了才进行控制,这显然没有多大意义。实际上这种方法一般只在单机版的应用程序中使用,而在Client/Server模式中是很少使用的。  
   
  2、“Key   and   Updateable   Columns”的是PB的默认选项,控制最为严格,可以实现最安全的并发控制,充分保证数据的完整性,但它也会禁止我们做一些本当允许的并发修改(如上面所说的第二例),是并发能力最差的方法。  
   
  3、“Key   and   Modified   Columns”选项可以说是前两者的折衷,在控制数据完整性和严格性方面比第一项强,比第二项弱,在允许的并发操作数量方面比第一项少,比第二项多。  
   
  至于在程序中选取哪一种控制比较合适,我们应该根据应用的具体情况来选择。  
   
  对于并发控制,我们还需要在程序中捕获   DBMS   的出错号,再显示相应的错误信息,否则PowerBuilder给出的那些出错信息,一般用户是看不懂的。这项功能可在数据窗口的dberror事件中编写代码实现。  
  Top

2 楼jhjjw(巨灵)回复于 2004-10-22 20:06:43 得分 0

楼上的,我在保存出错的时候没提示Rows   changed   between   retrieve   and   update.这个,而且我在先前也说了,和UPDATE属性没关系。  
  Top

3 楼workhand(我可憨了...)回复于 2004-10-22 20:13:28 得分 0

你是说你执行你的语句后获得的sqldbcode=0吗?  
   
  =0不就是成功了吗?没有errtext也是正确的啊Top

4 楼jhjjw(巨灵)回复于 2004-10-22 20:15:28 得分 0

是啊,这正是我奇怪的地方。我调试的时候,这几个值都是显示正确的,但它偏偏还是有错误提示啊。晕死了。Top

5 楼workhand(我可憨了...)回复于 2004-10-22 20:19:13 得分 0

你的dw是什么格式的,update属性怎么设置的?应该没问题啊Top

6 楼jhjjw(巨灵)回复于 2004-10-22 20:20:50 得分 0

freefrom,UPDATE属性我都试过了,不起作用啊。按理说,在No   changes   made   to   database.   之前应该有一句明确表示是何原因出错的信息的,但系统没给我啊。Top

7 楼jhjjw(巨灵)回复于 2004-10-22 20:24:22 得分 0

PB搞了这么多年,从来没有象今天这么郁闷过。都一天了,问题还是没解决!Top

8 楼jhjjw(巨灵)回复于 2004-10-22 20:25:14 得分 0

以下是我捕获的具体信息。  
   
  时             间:2004-10-22 20:18:58  
    sqldbcode:0  
  sqlerrtext:  
   
  No   changes   made   to   database.  
   
  INSERT   INTO   "ZF_LA_DETAIL"   (   "LA_GEN_CODE",   "DJR",   "DJRQ",   "DSR",   "XB",   "NL",   "ZY",   "YZBM",   "DH",   "FZR",   "ZZ",   "AFD",   "AJLY",   "AQ",   "CBR",   "CBRQ",   "CBJGYJ",   "CBJGRQ",   "JLDYJ",   "JLDRQ",   "LXA",   "LAZT",   "SMWJ",   "JZQM",   "AJXZ",   "AJJZ",   "CBJGQM",   "AJXZWFXW",   "AJLX",   "FZYJ",   "FZQM",   "FZRQ"   )   VALUES   (   :1,   :2,   :3,   :4,   :5,   :6,   :7,   :8,   :9,   :10,   :11,   :12,   :13,   :14,   :15,   :16,   :17,   :18,   :19,   :20,   :21,   :22,   :23,   :24,   :25,   :26,   :27,   :28,   :29,   :30,   :31,   :32   )  
          buffer:  
                row:1  
      SQLNRows:1Top

9 楼daixf_csdn(圣殿骑士【CNO】)回复于 2004-10-22 20:26:23 得分 10

那估计是你的事务控制问题,我猜你的保存过程中,触发了其他事务,比如说这个表有个触发器,  
  在某些情况下,事务没有完全提交,提交了一部分,从而造成了你说的保存成功了,但是还有错误提示,  
  那个错误提示,应该是其他事务执行失败导致的.Top

10 楼jhjjw(巨灵)回复于 2004-10-22 20:29:32 得分 0

我的程序是每隔1秒就生成一条记录,然后开始保存。   可以确定的是只有当前一个事务,也没有触发器,该不会是系统来不及处理一秒钟一条的记录吧。Top

11 楼jhjjw(巨灵)回复于 2004-10-22 20:30:35 得分 0

另:其实数据并没有保存到数据库去,而是SQLCODE,SQLDBCODE均为0而已。Top

12 楼sywen(古道西风)回复于 2004-10-26 16:14:45 得分 10

是不是你的update   properties中的Unique   Key   Columns設置有問題Top

13 楼songzj8(海风)回复于 2004-10-26 16:25:13 得分 10

1、数据库有可能被锁住(是不是都用户同时操作了)  
  2、not   null字段插入null值(调用accepttext了吗)  
  Top

14 楼wjmsino(从头再来)回复于 2004-10-29 17:02:56 得分 10

我也碰到过,没找到原因,换了个环境就可以了,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值