目前遇到这样一个问题:
    数据库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。这样就会更新了——这表示应用服务器那里的数据是正确的,只是没有及时的更新回到客户端。  推而广之,如果是数据库触发器的修改了数据,也不能及时的更新到客户端。  请问:如何正确的更新这种数据?我不知道该用哪些设置或者调用什么函数。特别是,如果这个字段没有任何特别的特征(比如索引、主键之类的)。  谢谢。

解决方案 »

  1.   

    在ADO的Client cursor下就是这样吧
      

  2.   

    在ADO的client-cursor下好像就是这样啊
      

  3.   

    已解决的问题,不要用AutoRefresh,用poPropogateChanges. 具体看:
    http://expert.csdn.net/Expert/topic/1964/1964802.xml?temp=.2390406
    看 comanche(太可怕) 的回复
    补充的是:    MaxID := AdoQry.FieldByName('MAX_ID').AsInteger;
        DeltaDS.FieldByName('ID').NewValue := MaxID;

      DeltaDS.FieldByName('ID').NewValue := MaxID;
    之前加上一句话
      DeltaDS.FieldByName('ID').ReadOnly := False;
      

  4.   

    但我用的是 SQL SERVER的 STORED PROCEDRUE,怎么都不行