我原来是连接table 将resolvetodata设为true,就可以
可如果是连接query却不行,这是为何? 

解决方案 »

  1.   

    “实际存入数据库的却变成的四条记录”?那是当然的,因为ApplyUPdates是更新所有变化过的记录,包括新增的空记录。至于后面两条和第二条一样,我倒没发现过。
    resolvetodata需要服务端处理数据更新过程,ADOQuery是可以的,Query可能要用CachedUpdates才行,你试试
      

  2.   

    我的做法:
    中间层(远程数据模块):tquery只改数据库别名,其它属性不动,tdatasetprovider改
    allowcommandtext为true,改dataset为tquery
    客户端tclientdataset改remoteserver为你的remoteserver,改providername为
    tdatasetprovider,其它都不动就可以了
    附加一句:dana,你的三层问题真是多
    附加二句:我学delphi半年,最先就接触三层
      

  3.   

    我刚接触三层的不久,
    我也是设置和你一样,不过我用的是paradox数据库,执行了applyupdates(-1)就出现这样了,
    不知是什么原因? 
      

  4.   

    我没法发,太大了,
    上次你说ProviderFlags的pfWhere、pfUpdate 属性设为false就可以,可现在我又不行了不知是什么原因。
      

  5.   

    不是,我可没有说过全部设成False。
    pfWhere对于主键字段都要设为True。
    pfUpdate对于需要更新的字段都要设为True。
    你能不能模拟一下DBDEMOS下的一个表,做个示范程序给我看呢?
      

  6.   

    是啊,由于你是用Paradox的,根本无法用SQL Monitor监视SQL语句到底那里出问题?
      

  7.   

    那DataSetProvider1、ClientDataSet1这两个控件还有什么特殊的属性需要注意的吗?
      

  8.   

    这两个控件基本上没有。
    请收Email。
      

  9.   

    比如说我在dbrgrid的onColExit事件处理提交,就会造成数据提交错误,
    procedure TDZZB_FOR.DBG1ColExit(Sender: TObject);
    begin
     WITH DZ_QY1_cds DO
     BEGIN
     BK:=GETBOOKMARK;
     DisableControls;
      FIRST;
       WHILE NOT EOF DO
       BEGIN
         DZZB_FOR.II:=DZZB_FOR.II+fieldbyname('IIII').AsFLOAT;
         DZZB_FOR.OO:=DZZB_FOR.OO+fieldbyname('OOOO').AsFLOAT;
        NEXT;
       END;
      //
       ApplyUpdates(-1);
      EnableControls;
      GOTOBOOKMARK(BK);
      FREEBOOKMARK(BK);
     END;end;
      

  10.   

    那放在onColExit这个事件中行吗?
    因为我将这段代码放在这里就会出现前面讲的那样,
    可我将这段代码放在formclose时提交就不会出错了,那这是什么原因?
      

  11.   

    难道数据被提交了多次?按照道理来说提交一次后,CDS的DELTA就被清空了,即使被提交也不会再次提交数据。
      

  12.   

    paradox有什么不一样的设置吗? 
      

  13.   

    奇怪了,刚才我用了Delphi自带的EmpEdit,怎么试都没有出现重复的记录。
      

  14.   

    我觉得如果可能,是否把数据库迁移到Interbase上面,由于你是三层程序,只要类型兼容,我觉得程序基本上是不改的。这样,你就可以通过SQL Monitor监视到底怎么回事?
      

  15.   

    我再试试看,你帮我看一下这个行吗?
    http://www.csdn.net/expert/TopicView.asp?id=250553
      

  16.   

    来信已到,
    可是我发现在同一个dbgrid中只要执行了两次applyupdates(-1)
    实际数据库数据就和dbgrid中的数据不一致了,如何将CDS的DELTA清除掉。
      

  17.   

    1、我这里没有出现过啊。是否是数据没有提交?因为DBGRID在ROW发生变化是没有提交。
    2、applyupdates后,Delta被自动清空了。如果需要手动清空,要用mergechangelogs.
      

  18.   

    DBGRID在ROW发生变化时是提交,
    可当有提交数据时数据经常乱了。
    mergechangelogs. 这个如何用?
      

  19.   

    从你的代码看,没有提交。(只是Post了,没有ApplyUpdates)。
    我在验证你的程序发现,如果输入完数据,按Tab键,那么数据就提交了。而按上、下键数据没有提交,这个时候刷新就发现不对了。cds.MergeChangeLog;