众位大侠帮帮忙吧我使用的是delphi 和 paradox数据库有两个表主从表结构   在从表中插入数据时如果插入两行没有任何问题,如果插入两行后再插入第三行的时候总提示:key violation 提示,是提示的主键重复,可是根据我的程序的循环是不会出现关键字重复的主表的关键字是:fplx,fpdm,fphm  从表的关键字是 fplx,fpdm,fphm,fpxh代码如下:
body.First ;
          while not body.Eof do begin
            if body.RecNo = 1 then begin
              gdsfpmx.First ;
            end else begin
              gdsfpmx.Append;
            end;
            
            gdsfpmx.Edit;
gdsfpmx.FindField('fplx').Value     := 's'
            gdsfpmx.FindField('fpdm').Value       := fpdm;
            gdsfpmx.FindField('fphm').Value       := fphm;
            iIdx := iIdx + 10;
            gdsfpmx.FindField('fpxh').Value   := iIdx;
            
            try
              gdsfpmx.FindField('spbh').Value       := 'ZAQXSW';
            except
              on e:Exception do
                log('商品编号:' + e.Message);
            end;            GetGoodsCode('ZAQXSW',spmch,spggxh,spjldw,spslv,spdj,false);            gdsfpmx.FindField('spmc').AsString    := 'ZAQXSW';
            gdsfpmx.FindField('sl').Value         := spsl;
            gdsfpmx.FindField('je').AsFloat         := spje;
            gdsfpmx.FindField('slv').Value           := spslv;
            gdsfpmx.FindField('djbh').AsString  := xsdjbh;
            gdsfpmx.FindField('djmxxh').AsInteger  := djmxxh;
            body.Next;
          end;

解决方案 »

  1.   

    知道为什么第三行时才报错吗,应为你没有post,添加第三行时自动post第二行,所以报错
      

  2.   

    我也试验过post 也是一样的错误,fplx,fpdm,fphm,fpxh  这个是从表的主键
      

  3.   

    我刚才测试了一下,如果使用post后,只能插入一行记录,第二行就出现同样的错误
      

  4.   

    begin
      body.First ;
      while not body.Eof do
      begin
        gdsfpmx.Append;
        gdsfpmx.FieldByName('fplx').Value    := 's'
        gdsfpmx.FieldByName('fpdm').Value      := fpdm;
        gdsfpmx.FieldByName('fphm').Value      := fphm;
        iIdx := iIdx + 10;
        gdsfpmx.FieldByName('fpxh').Value  := iIdx;    gdsfpmx.FieldByName('spbh').Value      := 'ZAQXSW';
        GetGoodsCode('ZAQXSW',spmch,spggxh,spjldw,spslv,spdj,false);    gdsfpmx.FieldByName('spmc').AsString    := 'ZAQXSW';
        gdsfpmx.FieldByName('sl').Value        := spsl;
        gdsfpmx.FieldByName('je').AsFloat        := spje;
        gdsfpmx.FieldByName('slv').Value          := spslv;
        gdsfpmx.FieldByName('djbh').AsString  := xsdjbh;
        gdsfpmx.FieldByName('djmxxh').AsInteger  := djmxxh;
        try
          gdsfpmx.post;
        except
          //
        end;    body.Next;
      end;
    end;