MIDAS客户端如何刷新为数据库的物理数据?(100分)

  • 主题发起人 主题发起人 hlsl
  • 开始时间 开始时间
H

hlsl

Unregistered / Unconfirmed
GUEST, unregistred user!
目前遇到这样一个问题:
简单来说,这是个更新数据的问题。请看:
数据库SQL SERVER中的一个表 A,其中有一个自动加1的字段ID,也就是int的标识字段。我对这个表添加记录后,post-ApplyUpdate,之后记录提交正确,但是这个ID字段是空的——数据没有更新回来。由于这个字段是作为主键,那么再继续添加记录的时候,由于都是空的,所以CLIENT认为“主键冲突”。
我对这个问题是这样考虑的,标识字段的数据只有真正写到数据库中的时候,才会为这个字段产生一个值。我在CLIENT提交数据的时候,这个字段是不可编辑的(只读)。提交到了应用服务器(中间层、远程数据模板)那里的时候,这个字段还是空的。当应用服务器中对应的TADOTable真正提交到SQL SERVER的时候,这个字段才被SQL SERVER赋值。
由于以上的原因,CLIENT提交数据后,这个字段的值是空的——虽然数据库中实际的字段上是已经有值了的,但是并没有更新回来。
我尝试把应用服务器的Provider的option里面设置了AutoRefresh,在客户端ApplyUpdate后调用Refresh,都没有作用(如果调用RefreshRecord会提示其他用户修改了该字段)。目前,我只采用了一个临时变通的办法,就是ApplyUpdate后把ClientDataSet Close 后然后再 Open。这样就会更新了——这表示应用服务器那里的数据是正确的,只是没有及时的更新回到客户端。
  推而广之,如果是数据库触发器的修改了数据,也不能及时的更新到客户端。
  请问:如何正确的更新这种数据?我不知道该用哪些设置或者调用什么函数。特别是,如果这个字段没有任何特别的特征(比如索引、主键之类的)。
  谢谢。
 
clientdataset1.applyupdate(0);
clientdataset1.refresh;
客户端当然要自己刷新
 
是啊,我这样做了,但是没有用的,那个字段仍然是空的。
 
这个问题恐怕没有好的解决方法。
如果数据写到数据库后还要继续编辑,建议考虑增加一个唯一标识这条记录的xxid
 
其实,应用服务器那里的数据是正确的——因为ClientData Close - Open 之后的数据也是正确的。如何能够不Close-Open而刷新数据呢?不知道是否有合适的方法/函数
 
那你就用存贮过程式插入记录后返回ID字段值,
然后在客户端:
clientdataset1.insert;
clientdateset1.fleldbyname('...').value=...
...
clientdateset1.MergeChangeLog;
不要怕麻烦,反正我就是这样做的。
 
这个做法倒是可以解决,不过对每个数据表的操作都要写。。。。这个好象太复杂了吧?
 
在服务器段afterpost后refresh试试
如不行,两端同时用,不可能不行的
 
我的意见是你即然要把这个字段值回送到客户端的话,就不要用AuotInc字段,而应该用自己的逻辑来生成这个字段,要不然你要把数据传来传去的,网络也是很累的!
 
偶不用ClientDataset,偶是自己写数据对象代码,返回的结果一定是最新的结果,在多用
户并发使用服务器时通过“推”数据实现。不过Grandboy说的方法一定不可靠。在单用户
环境下也许可以,多用户环境下无法实现自定义ID字段,必须信赖数据库来自动生成。
 
SocketConnection/COMConnection支持回调(我可是从来没有调通过),看看我曾经说过的
方法是否管用:
http://www.delphibbs.com/delphibbs/dispq.asp?LID=1990619
 
1.如果你是delphi5请打补丁,AutoRefresh就起作用了
2.
DatasetProvider.Options.poPropogateChanges:= true;
procedure TForm1.DataSetProvider1AfterUpdateRecord(Sender: TObject;
SourceDS: TDataSet;
DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind);
begin
if UpdateKind = ukInsert then
begin
self.ADODataSet2.Close;
ADODataSet2.CommandText:='select @@Identity as FId ';
self.ADODataSet2.Open;
DeltaDS.FieldByName('CategoryID').ReadOnly:=False;
DeltaDS.FieldByName('CategoryID').NewValue:=self.ADODataSet2['FId'];
end;
end;
CategoryID为自增字段
不用刷新,ApplyUpdates之后自增字段即可返回
 
用GIT可以方便地实现回调,不过还要用到消息处理才更理想,而且还有很多细节
 
???
好象有点跑题了吧
 
感谢各位,问题解决。
客户端更新后刷新可以返回数据,是我的DBGRID的问题,我用的是DevExpress的dxDBGrid
 
但是你有没有考虑过每次更新都刷新,网络的Roundtrip会很多的
 
这也没办法,只能自己手动去更新那些数据了吧?
 
感谢各位,不好意思拖了这么久才结
 
多人接受答案了。
 
后退
顶部