感谢大哥们的持续帮忙,终于程序运行通过,但是调试上出了问题~~~
    with ADOQueryID do
    try
      begin
        close;
        sql.Clear;
        sql.add('select max(ID) as ID from spectrum ');
        //     prepared;
        Open;
        if ADOQueryID.RecordCount>1 then
          maxID:=ADOQueryID.Fields.Fields[0].AsInteger+1
        else
          maxID:=1;
        ADOQueryID.close;
        ExecSQL;
      end;      with ADOQuery1 do
      begin
        close;
        sql.Clear;
        sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:maxID,:arrwave[i],:arrintensity[i])');
        for i:=0 to 2090 do
        begin
          try
            begin
              // ADOQuery1.Open;
              ADOConnection1.BeginTrans;
              append;----------------------------------------------------运行完这句出错~~
              fieldbyname('ID').value:=maxID;
              fieldbyname('Wavenumber').value:=arrwave[i];
              fieldbyname('Intensity').value:=arrintensity[i];
              post;
              next;
              ADOConnection1.CommitTrans;
              ExecSQL;
              showmessage('done');
            end;
          except
            begin
              showmessage('同步出错');
              ADOConnection1.RollbackTrans;
            end;
          end;
        end;
      end;
    finally;
    end;
  end;

解决方案 »

  1.   

    with ADOQuery1 do 
          begin 
            close; 
            sql.Clear; 
            sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:maxID,:arrwave[i],:arrintensity[i])'); 
            for i:=0 to 2090 do 
            begin 
              try 
                begin 
                  // ADOQuery1.Open; 
                  ADOConnection1.BeginTrans; 
                  append;----------------------------------------------------运行完这句出错~~ 
                  //前面你已经用insert into 语句了,没有必要再Append,把append去掉
                  fieldbyname('ID').value:=maxID; 
                  fieldbyname('Wavenumber').value:=arrwave[i]; 
                  fieldbyname('Intensity').value:=arrintensity[i]; 
                  post; //去掉
                  next; 
                  ADOConnection1.CommitTrans; 
                  ExecSQL; 
                  showmessage('done'); 
                end; 
              except 
                begin 
                  showmessage('同步出错'); 
                  ADOConnection1.RollbackTrans; 
                end; 
              end; 
            end; 
          end; ADOQuery1要先打开才能编辑的
      

  2.   

    ADOConnection1.BeginTrans; 要写在with ADOQuery1 do 上面
      

  3.   

    修改后运行还是不成,在append;语句后还是出现同样的问题~~
      

  4.   

    with ADOQuery1 do 
          begin 
            close; 
            sql.Clear; 
            sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:maxID,:arrwave[i],:arrintensity[i])'); 
            for i:=0 to 2090 do 
            begin 
              try 
                begin 
                  // ADOQuery1.Open; 
                  ADOConnection1.BeginTrans; 
                  append;----------------------------------------------------运行完这句出错~~ 
               前面你已经用insert into 语句了,没有必要再Append,把append去掉
                  fieldbyname('ID').value:=maxID; 
                  fieldbyname('Wavenumber').value:=arrwave[i]; 
                  fieldbyname('Intensity').value:=arrintensity[i]; 
                  post; 去掉
                  next; 
                  ADOConnection1.CommitTrans; 
                  ExecSQL; 
                  showmessage('done'); 
                end; 
              except 
                begin 
                  showmessage('同步出错'); 
                  ADOConnection1.RollbackTrans; 
                end; 
              end; 
            end; 
          end; 
      

  5.   


          ADOConnection1.BeginTrans; 
          with ADOQuery1 do 
          begin 
            close; 
            sql.Clear; 
            sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:maxID,:arrwave[i],:arrintensity[i])'); 
            for i:=0 to 2090 do 
            begin 
              try 
                begin 
                  // ADOQuery1.Open;               
                  //append;----------------------------------------------------运行完这句出错~~ 
                  fieldbyname('ID').value:=maxID; 
                  fieldbyname('Wavenumber').value:=arrwave[i]; 
                  fieldbyname('Intensity').value:=arrintensity[i]; 
                  //post; 
                  next;               
          
                  //showmessage('done'); //不要在这提示,要不会出现2000多个对话框
                end; 
              except 
                begin 
                  showmessage('同步出错'); 
                  ADOConnection1.RollbackTrans; 
                end; 
              end; 
              ExecSQL; 
            end; 
            ADOConnection1.CommitTrans; 
          end; 
      

  6.   

    哦~~~这回错误变了 ADOQuery1:Dataset not in edit or insert mode.
      

  7.   

            sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:maxID,:arrwave[i],:arrintensity[i])');
            Open;//-----------------------
            for i:=0 to 2090 do 
            begin 
              try 
                begin 
              
                  append;---------------------------
                  fieldbyname('ID').value:=maxID; 
                  fieldbyname('Wavenumber').value:=arrwave[i]; 
                  fieldbyname('Intensity').value:=arrintensity[i];  
                  next;               
          
      

  8.   


    按照你的修改了在执行完open;后出现错误: 索引或主关键字不能包含一个空(null)值~~~
      

  9.   


    ADOConnection1.BeginTrans; 
          with ADOQuery1 do 
          begin 
            close; 
            sql.Clear; 
            sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:maxID,:arrwave[i],:arrintensity[i])'); 
            for i:=0 to 2090 do 
            begin 
              try 
                begin 
                  // ADOQuery1.Open;               
                  //append;----------------------------------------------------运行完这句出错~~ 
                  Parameters.ParamByName('ID').Value:=maxID;//fieldbyname('ID').value:=maxID; 修改此处
                  Parameters.ParamByName('Wavenumber').Value:=arrwave[i];//fieldbyname('Wavenumber').value:=arrwave[i]; 修改此处
                  Parameters.ParamByName('Intensity').Value:=arrintensity[i]//fieldbyname('Intensity').value:=arrintensity[i]; 修改此处
                  //post; 
                  next;               
          
                  //showmessage('done'); //不要在这提示,要不会出现2000多个对话框
                end; 
              except 
                begin 
                  showmessage('同步出错'); 
                  ADOConnection1.RollbackTrans; 
                end; 
              end; 
              ExecSQL; 
            end; 
            ADOConnection1.CommitTrans; 
          end; 
      

  10.   


    var
      I :Integer;
    begin
      ADOConnection1.Open;
      ADOConnection1.BeginTrans;
      try
        with ADOQuery1 do
        begin
          Close;
          SQL.Clear;
          SQL.Add('select top 0 * from test');//做的一个小例子,你不要写成insert into 这样,要不没有办法保存多条记录,先把ADOQuery1的//LockType属性设置为ltBatchOptimistic
          Open;
          for I :=0 to 3 do
          begin
            Append;
            FieldByName('StudentID').AsString :='111';
            FieldByName('ClassID').AsString :='222'; 
          end;
        end;
        ADOQuery1.Post;
        ADOQuery1.UpdateBatch();
        ADOConnection1.CommitTrans;
      except
        if ADOConnection1.InTransaction then ADOConnection1.RollbackTrans;
      end;
      

  11.   


    with ADOQueryID do 
        try 
          begin 
            close; 
            sql.Clear; 
            sql.add('select max(ID) as ID from spectrum '); 
            //    prepared; 
            Open; 
            if ADOQueryID.RecordCount>1 then 
              maxID:=ADOQueryID.Fields.Fields[0].AsInteger+1 
            else 
              maxID:=1; 
            ADOQueryID.close; 
            ExecSQL; 
          end;       with ADOQuery1 do 
          begin 
            close; 
            sql.text := 'select * from spectrum  where 1=2';
            open;  
            for i:=0 to 2090 do 
            begin 
              try 
                ADOConnection1.BeginTrans; 
                append;   
                fieldbyname('ID').value:= maxID; 
                fieldbyname('Wavenumber').value:=arrwave[i]; 
                fieldbyname('Intensity').value:=arrintensity[i]; 
                post; 
                next; 
                ADOConnection1.CommitTrans; 
              except 
                begin 
                  showmessage('同步出错'); 
                  ADOConnection1.RollbackTrans; 
                end; 
              end; 
            end; 
           showmessage('Done'); 
          end; 
        finally; 
        end; 
      end;這是操作數據集的提交方法
      

  12.   

    我的ID,Wavenumber,Intensity)  是字段名,不是参数
      

  13.   

    if ADOQuery1.State <> dsEdit then
      ADOQuery1.Edit;
      

  14.   


    我按照这个运行了一下,但是发现数据没有写入到access数据表中~~
      

  15.   


    with ADOQueryID do 
        try 
          begin 
            close; 
            sql.Clear; 
            sql.add('select max(ID) as ID from spectrum '); 
            //    prepared; 
            Open; 
            if ADOQueryID.RecordCount>1 then 
              maxID:=ADOQueryID.Fields.Fields[0].AsInteger+1 
            else 
              maxID:=1; 
            ADOQueryID.close; 
            ExecSQL; 
          end;       with ADOQuery1 do 
          begin 
            close; 
            sql.text := 'select * from spectrum  where 1=2';
            open;  
            ADOConnection1.BeginTrans;
            for i:=0 to 2090 do 
            begin 
              try              
                append;   
                fieldbyname('ID').value:= maxID; 
                fieldbyname('Wavenumber').value:=arrwave[i]; 
                fieldbyname('Intensity').value:=arrintensity[i]; 
                post;             
              except 
                begin 
                  showmessage('同步出错'); 
                  ADOConnection1.RollbackTrans; 
                  Abort;
                end; 
              end; 
            end; 
           ADOConnection1.CommitTrans;
           showmessage('Done'); 
          end; 
        finally; 
        end; 
      end;