调用applyupdate时,返回record changed by another user错误,怎样解决?(100分)

  • 主题发起人 主题发起人 rollli
  • 开始时间 开始时间
R

rollli

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
调用applyupdate时,返回record changed by another user错误,怎样解决?
 
不用bde,用ado
 
可以采用MIDAS提供的错误处理机制,遇到这种情况时
要将错误信息返回到客户端,由客户端自己作出处理
执行办法有更正、取消等,具体方法可以查看李维的书
上关于MIDAS提供的错误处理机制,这个方法我试过,完全可行
 
我也遇到了这个问题,一直没搞定,没办法,老板催的紧,破于无奈,我改用commandtext,
不用applyupdates了,以后搞定了在说吧。
 
用commandtext就失去了三层的意义了
 
在delphi的NEW ITEMS 對話盒的DIALOGS頁有一個RECONCILE Error Dialog 對話盒.點選它可以
在Tclientdataset 的Onreconcile Error 事件處理函數中呼叫并且處理錯誤的對話框
在 Tclientdataset的OnReconcileError 加入
  handlereconcileError(dataset,updateKind,e);
這樣就可以對發生易動的資料處理了!
發分吧!
 
这问题我常遇到,可以肯定的是你的代码存在问题,发生这个问题的原因很简单,
在你applyupdate时,服务端会检查中间层更新前的数据和数据库中的数据是否相同,如果
不同则报这个错误。
1、首先你需要排除并发事务的问题,这是很容易产生这个错误的。
2、在我遇到的多数情况下,是midas的内部机制问题,尤其是在我有数值类型的字段进行通信
时,无论你是否修改过该字段,经常会发生服务端该字段值莫名其妙地变成了0,因此,我
尽量避免select数值字段
3、请检查你在中间层的处理代码,也可能导致这类错误
4、我最后的选择是基本上在中间层不写代码,变成一个2层的变形
 
我中间层没写代码,也遇到这个问题。用RECONCILE Error Dialog 對話盒correct也不行。
 
有没有看李维的书?
多数情况下这种错误是因为你的 TDataSetProvider 的 Update 模式为upWhereAll,
改为upWhereKeyOnly可以解决多个客户端同时修改一笔Record时发生的这种问题用
SQL Monitor Trance 一下 SQL你就会明白了。
 
同意,把Update 模式为upwherechanged就搞定了。
 
好像还是不行.可以肯定的是只有我一个应用在运行
 
主要原因是客户端回传的实数字段的值与服务端的原值不一样造成的。比如原值是2.9999
,而回传值却成了3.000。这样的话显然根据回传值已经无法找到原记录了,当然Delphi就
认为原记录已被别人改动了。这是Delphi的一个Bug。
TDataSetProvider.updatemode设为upWhereKeyOnly可以解决主键不为实数字段时的问题。
 
我的关键字是字符型的,在对一条记录的几个real字段进行修改后保存,一般是连续进行
3次操作,肯定出错.不知道怎样解决。求助!
 
以前我和同事就碰到这个问题。后来总结了一下主要是有一下五种情况:
1、在你修改数据库以后别人修改了数据库,这种情况属于正常情况。比较容易理解
2、数据表里面设有缺省值,在ClientDataSet新建记录以后,本地可能没有填入该字段的值
,在applyupdates以后,ClientDataSet中的记录与上面事实上是不一样的(缺省值的地方
)。再次修改后applyupdates,在updateWhereAll的情况下必然会出错。
3、数据字段设成char的时候使用MS sql server也容易引起错误,原因类似 2。
4、数据表里面没有设主键或者唯一索引,似乎会出错。
5、包含有比较特别的字段,比如TDateTime,由于微软和Borland公司对时间的解释
“略有不同”,DateTime记录到毫秒,比如对于:2001-11-4 19:19:01 在微软的数据库
里面可能真正的值是相当于2001-11-4 19:19:00.568 ,如果转成字符串,微软会认为
是2001-11-4 19:19:01 ,但是Borland公司把后面的毫秒四舍五入,
解释成“ 2001--11-4 19:19:00”,在applyupdates的时候就会拿这个字符串
去数据库里面找,微软的ADO引擎(假设用的是ADO)自然是找不到对应的记录。所以
也会引发错误。这个错误是非常隐蔽的,实数字段估计也是相应的原因引起的。
目前Borland提供的D6的2个补丁包里面都没有解决这个问题。
对于5最好的解决方法是指望Borland公司提供补丁修正,目前可以暂时做这样的处理
:1、如果不是多用户同时操作该表或记录,您可以用设定upWhereKeyOnly的方法。
2、多用户时,对于有特别的字段,比如DateTime,在业务允许的情况下,只填写日期。避开
real类的字段,试用其他的字段来代替。
3、不要用applyupdaes或者Delta来处理,使用自己组织 Sql语句。

 
我正在為以上的情況煩惱,以上的方案都試過,無論怎么樣都不行,但是在我開發的這臺機器
上就可以,一旦复制到其他機器上就發生這個問題了
 
[:(!][:(!]强烈关注,我也是这样。我用的是d5+win2K,不知道你们呢?
 
我也不懂哦
 
常经典的错误,原因我就不说了(上面已经说得很清楚了),
我的解决办法(应该比较适合你)
1、数据库应设关键字
2、如果用Ttable,将UpdateMode设为pWhereKeyOnly,Tdatasetprovider也
这么设,完全可以搞定
3、如果用Tquery,则千万不要动这一属性,用默认的pWhereAll即可,
但必须设置real,numric,money等字段的属性,将ProviderFlags中的
pfInWhere设为false,如果是永久性字段对象,直接对字段编辑器可以设置,
反之,必须在Tquery中的Afteropen事件设置,保险的做法是将除关键字
以外所有字段设为false。
4、强列建议用Ttable编辑数据,不要误信人言,它的效率非常高
 
我碰过因为Trigger造成的这种错误
 
我也遇过此类问题,不过已解决
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1011485
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部