请问一个问题,在三层结构中当我在更改一条记录的同时,有人在服务端的数据库里也更改这条记录,并且比我更改的快,那么我如何在发生错误的时候得到这条记录的最新值?(1

  • 主题发起人 主题发起人 xhyph
  • 开始时间 开始时间
X

xhyph

Unregistered / Unconfirmed
GUEST, unregistred user!
请问一个问题,在三层结构中当我在更改一条记录的同时,有人在服务端的数据库里也更改这条记录,并且比我更改的快,那么我如何在发生错误的时候得到这条记录的最新值?(100分)<br />比如说,有条记录是 书名='程序员';
有人在服务端的数据库里更改它为 书名='程序员大本营'
而我这里的客户端当然仍旧是'程序员'
这时候我要把客户端的 书名='程序员'更改为 '程序员2001'
这时候当然会出错,当我根据书上所说

procedure TSDIAppForm.ClientDataSetReconcileError(
DataSet: TClientDataSet;
E: EReconcileError;
UpdateKind: TUpdateKind;
var Action: TReconcileAction);

ShowMessage(VarToStr(FDataSet.FieldByName('书名').CurValue);
以获得那个在服务端更改后的 书名的最新记录'程序员大本营'
但是这时候却得到个空值
请问我如何在发生这样的错误后得到那个最新的记录值?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=882904
看一下吧。
 
那里没说什么呀?我用Reconcile Error Dialog也得不到
 
从FDataSet里当然得不到被他人更新的字段值,结果集只是实际数据的一个快照,除非你的Cursor类型是Dynamic的。
 
用COM+写成同步
 
To fpsky:
如何用Com+写成同步。同步是什么?
 
VarToStr(FDataSet.FieldByName('书名').CurValue
改成
VarToStr(DataSet.FieldByName('书名').Value
或者直接从数据库取
 
根据我的经验,如果你的服务器用MIDAS,则Reconcile Error Dialog应该能够得到更新错误。
 
李维《...系统篇》4-66 讲的很清楚
妮用此过程的DataSet取value就得啦!!!!
若用当前CDS就取newValue!!
我没空试,妮自己试一下!
 
我都试过 CurValue NewValue OldValue Value 都没用
用Reconcile Error Dialog也得不到
我只想知道能否得到,如果得不到也就算了
 
CurValue NewValue OldValue Value 在datasetprovider1.BeforeUpdateRecord中有用的,
至于clientdataset中我想也是有用的不过,可能不会很好用。
请看下面的用法:
//查看新的数量是否为0或是否改动了。
if (not VarIsEmpty(FieldbyName('zsl').NewValue)) or
(Vartostr(FieldbyName('zsl').NewValue)<>'') then

begin
//取得剩余数量的老值
if vartostr(FieldbyName('sysl').oldValue)<>'' then

moldsysl := strtofloat(vartostr(FieldbyName('sysl').oldValue))
else
moldsysl := 0;
//修改数量的值。
if moldsysl+(strtofloat(Vartostr(FieldbyName('zsl').NewValue))
-strtofloat(Vartostr(FieldbyName('zsl').OldValue)))<0 then

FieldbyName('zsl').Asfloat := strtofloat(Vartostr(FieldbyName('zsl').OldValue))
else
FieldbyName('sysl').Asfloat := moldsysl+
(strtofloat(Vartostr(FieldbyName('zsl').NewValue))-strtofloat(Vartostr(FieldbyName('zsl').OldValue)));
....
end;

以上代码在三层程序中就是在服务器端使用了。
 
后退
顶部