如果给个例程code也可以。偶要往一个access库里的表的末尾添条记录,库里主键是ID(integer),代码如下,
procedure Tdaily.BitBtn1Click(Sender: TObject);
var
    newid:integer;
begin
    table1.Open;
    newid:=0;
    with table1 do
      begin
        first;
        if not eof then
          if newid <= fieldbyname('id').AsInteger then
            newid:= fieldbyname('id').AsInteger;
        next;
      end;
    newid := newid+1;
    table1.Append;
    table1.AppendRecord([newid,combobox2.Text,memo1.Text,strtodate(edit3.Text),combobox1.Text]);
    table1.Close;就是总出错,说是我主索引重复。可是我每次都是取最大的然后+1的啊!!!!

解决方案 »

  1.   

    不用添加id,在Access中设置为自动增加,往里写数据的时候Access会自动添加id的。
      

  2.   

    access库的ID本来就可以自动加的,何必自己处理这么麻烦呢
      

  3.   

    if not eof then
    改为
    while not eof do
      begin
    ...
    ...
      

  4.   

    楼上正确!
    如果ID定义的容量比较小,比如说是0到255,那么到了最后无论你的NEWID是多少,都只能插入255,当然是重复索引啦!
      

  5.   

    to 不死鸟:   晕死。我改完了一编译,点完按钮程序居然死乐。鼠标的状态显示是SQL。。天那~!!
      

  6.   

    if not eof then
    begin   //这里加个begin..end看
              if newid <= fieldbyname('id').AsInteger then
                newid:= fieldbyname('id').AsInteger;
    end;
      

  7.   

    table1.Append;这句好像有点多余    table1.AppendRecord在这句后面加一句table1.post;    with table1 do
          begin
            first;
            if not eof then
              if newid <= fieldbyname('id').AsInteger then
                newid:= fieldbyname('id').AsInteger;
            next;
          end;
      改成
       table1.last;
       newid:= fieldbyname('id').AsInteger;
    这样效率要比你的高点;
       另外还要判断一下table1中记录是否为空;我没调试,不知道行不行,你自己看看吧。
      

  8.   

    你用table1.RecordCount+1作为主键的ID,就可以了这两句这样写改成这样
        table1.Append;
        table1.AppendRecord([newid,combobox2.Text,memo1.Text,strtodate(edit3.Text),combobox1.Text]);
        table1.Append;
        table1.FieldByName(字段名).asstring:=值
        ...
        
        table1.Post;
        
      

  9.   

    procedure Tdaily.BitBtn1Click(Sender: TObject);
    var
        newid:integer;
    begin
        table1.Open;
        newid:=0;
        with table1 do
          begin
            first;
            while not eof then
              begin
                if newid <= fieldbyname('id').AsInteger then
                  newid:= fieldbyname('id').AsInteger;
                next;
              end;
          end;
        newid := newid+1;
        table1.Append;
        table1.AppendRecord([newid,combobox2.Text,memo1.Text,strtodate(edit3.Text),combobox1.Text]);
        table1.Close;
      

  10.   

    需要这么复杂吗?把Id的数据类型设置为:自动编号每次插入的时候根本不用管这个Id字段。
      

  11.   

    散分散分。谢谢各位。特别感谢 yimoo(宝剑锋自磨砺出 梅花香自苦寒来) 
    我刚刚改完。调试米问题。再看你最后给我的code 。。一样的。:)大家都有分。再次感谢
      

  12.   

    还有,自动编号不可以~~ 编译下面这句的时候就会报错:)
    table1.AppendRecord([newid,combobox2.Text,memo1.Text,strtodate(edit3.Text),combobox1.Text]);
      

  13.   

    这样呢?不是说不用管id吗.
    table1.AppendRecord([combobox2.Text,memo1.Text,strtodate(edit3.Text),combobox1.Text]);
      

  14.   

    自动编号可以
    append的时候不用newid
      

  15.   

    自动编号就不用添加newid 字段了
    table1.AppendRecord([combobox2.Text,memo1.Text,strtodate(edit3.Text),combobox1.Text]);