我在服务端用ADOQUERY1,客户端用DCOM,Clientdataset连接服务端应用程序
的数据库的一表TABLENAME,且ID为自累INT型。
为什么我执行
tmpID:=Clientdataset1.fieldbyname('ID').AsInteger;
为什么取出来的值老是0??(在单机程序以bde,ado做都能读取ID值)
试了许多方法如clientdataset.refreshe,clientdataset.close;clientdataset.open.都不行,
望高手相助!

解决方案 »

  1.   

    adoQuery1没有active吗?或者在取值前 adoQuery1 重新从DATABASE取值。
      

  2.   

    已经激活了clientdataset和adoquery1.active=true了,其他字段都可以读出来,比如
    tmpAccounts:=clientdataset1.fieldbyname('Accounts').AsInteger;比如读的值为434532
      

  3.   

    在视图里:1.加个distinct或
    2.用别名试试
      

  4.   

    在已经select 出来的内容中直接取Id是没问题的,但用Append,post后,直接取ID,其值会为0,建议post后用另外一query 用'select max(id) from 表名' 实现。
      

  5.   

    打开数据库看看,id是否都为0
    如果不是,当然确认datesource打开情况下
    //试试这个
    Clientdataset1.first;
    while Not Clientdataset1.eof do
    begin
      tmpID:=Clientdataset1.fieldbyname('ID').AsInteger;
      memo1.lines.add(tmpid);
      Clientdataset1.next;
    end;
      

  6.   

    先执行
    ClientDataSet1.ApplyUpdates(0);
    ClientDataSet1.Refresh;
    后即可
      

  7.   

    shadou(乷乧)说得可能很对,可能是第一行的id,你应该先运行查找,使指到你需要的记录上,
    比如用,findkey等
      

  8.   

    你用的数据库ID为自累计。ID值是可修改的吗?是 NOT NULL 的吗?如果这个值是由你的数据库内部自动生成的?如果是你就可不用考虑这个问题了,在本地(远程)数据库中加入相应的触发器就行。如果ID不是由数据库自动生成的,那么再检查一下程序。
    你的代码应没有大问题。我做的时。ID都能正确传过来。
    记住ClientDataSet1.ApplyUpdates(0);
    ClientDataSet1.Refresh;