三层结构中的容错处理(150分)

  • 主题发起人 主题发起人 lsha
  • 开始时间 开始时间
L

lsha

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:
在三层结构中,两个操作员在两台客户端机器上正在对同一张表进行修改,比如说该表
在SQL SERVER中的记录内容是这样的:
ID NAME SEX DPT(部门)
1 张三 男 程序室
2 李四 男 工程部
3 王五 男 业务部
两个客户端显示的记录都是以上信息,操作员A将张三所属的部门改为"业务部",执行Apply
Updates(-1)之后,此时数据表中的信息为张三属于业务部了,而操作员B将张三所属的部门
改为"工程部",执行ApplyUpdates(-1)之后,就会出错,错误信息为其他用户已经将此记录
修改,我在ReconcileError中通过其参数Dataset可得到字段DPT的CurValue,OldValud,New
Value,我将此时数据表中的记录,即张三已被修改为属于业务部了,可以显示给用户,但若
用户坚持要将张三改为"工程部",我就没办法处理了。请各位大虾指教!!!
 
用户坚持要改,你就重新提交让他改好了。
 
请问在三层结构中怎样重新提交,因为TClientDataSet控件的Delta属性为只读。
重新执行ApplyUpdates(-1)将出现同样的错误!
请大虾们继续指教,小弟将不胜感激!!!
 
Refresh 之后还不行吗?
 
不行,Refresh之后会出错,错误信息为"Must apply updates before refreshing data"
 
当 DataSetProvider.UpdateMode=upWhereAll 时,
update时 where 是指定全部字段,比如,
你有a、b、c 3个字段,修改了c字段,在app server中
修改的命令是
update ... set c=新c where a=旧a and b=旧b and c=旧c
如果 旧的a、b、c之一 已经被其他人改掉了,那where就
找不到合适的记录来修改了。所以报告“记录被其他人修改”,
这个问题和“锁定”是无关的。

当 DataSetProvider.UpdateMode=upWhereKeyOnly 时,
update时 where 是指定key字段,比如,
你有a、b、c 3个字段,修改了c字段,a是key field
在app server中修改的命令是
update ... set c=新c where a=旧a (只比较a字段)
你的程序应该设计为客户修改不到主键字段的值,这样
你的客户只能修改到其他字段的值,其他字段不会出现
在where中,就不会出现你说的问题了。

(注意如果你的表原来没有主键的,需要双击dataset,
添加你的所有field,在有唯一值的field的 ProviderFlasgs 属性
里面 InKey 设置为 true (该field必须是有唯一值的,能相当于主键的,
也就是能唯一确定该行记录的))
 
pipi,谢谢你拔刀相助,我还有一个问题就是怎样通过刷新来得到当前数据表中的最新
记录。我将ClientDataSet的Active属性置为false后又置为true,只能得到应用服务器最
初传来的数据,而将DCOMConnection的Connected属性置为false后又置为true,也是没有
效果,烦请你百忙中抽空指导,多谢了!
 
ClientDataset.Refresh 就可以重新取得数据。
如果你的不能取得最新数据,可能是其他用户
没有提交事务?

 
pipi很感谢你能多次回复!!!
 
后退
顶部