我用ADO访问ACCESS数据库,其中第一个字段:ID为自增长型的,我插入一条记录后,需要将这个I这个新ID传出作为它用,函数大致如下:
function TShareDB.AddFile(const FileName:string;var ID: Integer): Boolean;
begin
  Result := True;
  try
    FTable.AppendRecord([nil, ...]);
    FTable.Post;
    ID := FTable.FieldByName('ID').AsInteger;
  except
    Result := False;
  end;
end;但是这个ID就是不正确,请问大家应该怎样来正确获取这个自动增长型 的字段值。
我用Access打开文件看:记录确实已插入到表中而且ID值也是自动增长的.Refresh这个方法我也调用过,但是还不正确

解决方案 »

  1.   

    我喜欢这样写,直观、无错,并且调试方便:
    with FTable do
    begin
      Append;
      FieldValues['field_01'] := ...;
      FieldValues['field_02'] := ...;
      ...;
      Post;
      ID := FieldByName('ID').AsInteger;
    end;
      

  2.   

    嘿嘿写SQL
    select MAX(ID) from tablename
      

  3.   

    hthunter(核桃) 的写法我也用的。
      

  4.   

    你用APPEND 插入以后  转移到最后一条记录再取值 不过我的感觉  POST没用?
      

  5.   

    dh9450(谁有我菜) 的做法要在事务中使用,否则不能确保取到的ID是你刚刚提交的记录
      

  6.   

    即然是自动增加的ID,你可以不用管它:
    FTable.AppendRecord([nil, ...]);
    把null,去掉,改成
    FTable.AppendRecord([...]);
    试试,
      

  7.   

    同意wasprui(山登绝顶我为锋)的
     
    使用系统标量函数@@Identity
      

  8.   

    @@Identity会自动得到你刚插入记录的ID
      

  9.   

    怎么不行?你在查询分析器中
    insert 表  values(值)
    select @@identity
    就可以得到刚插入记录的ID
      

  10.   

    ADOTable的locktype属性是不是设成ltBatchOptimistic了,如果这样必须要updatebatch后才能得到正确的值
      

  11.   

    没有,我用的是Default的ltOptimistic
      

  12.   

    你这样写试试,
    在table2的beforepost里写
      with DataSet do
      begin
        edit;
        fieldbyname('id').AsInteger:=table2.fieldbyname('ID').asinteger;
      end;
      

  13.   

    没办法,只好另外写一条SQL语句了,总感觉效率低,没办法。时间要紧!!!!!谢谢各位