下面的代码,我是想实现往access数据表中写入数据,编译室通过了的,但是在运行完  Open;时提示错误:Project a2.exe raised exception class EDatabaseError with message'ADOquery1:Field'Wavenumber'not found'. 
请问是        sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值
这句话的问题吗?怎么改呢?
   with ADOQuery1 do
    try
      begin
        close;
        sql.Clear;
        sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值
        //     prepared;
        Open;--------错误出现
        if ADOQuery1.RecordCount>0 then
          maxID:=ADOQuery1.Fields.Fields[0].AsInteger
        else
          maxID:=1;
        ADOQuery1.close;      end;
      begin
        close;
        sql.Clear;
        sql.add('insert into spectrum values(:ID,:Wavenumber,:Intensity)');
        for i:=0 to 2090 do
        begin
          Parameters.ParamByName('ID').Value:=maxID+1;
          Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
          Parameters.ParamByName('Intensity').Value:=arrintensity[i];
          try
            prepared;
            ExecSQL;
            ShowMessage('成功');
          except
            on e: Exception do
            begin
              ShowMessage('出错');
            end;
          end;
        end;
      end;
    finally;
    end; //end with

解决方案 »

  1.   

    sql.add('insert into spectrum( 把列名寫出來        )  values(:ID,:Wavenumber,:Intensity)'); 
      

  2.   

    请问是        sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值 
    这句话的问题吗?怎么改呢? 
    不是這裏的問題。
      

  3.   

    还有麻烦个高手哥哥,我的这段程序实现的是   往数据表中写入横纵坐标,有三个字段:ID,Wavenumber--横,Intensity--纵,共有2090组数据,ID是我的横纵坐标生成图的编号,即2090组数据应具有相同的ID,请高手哥哥看看代码写的对吗???多谢多谢多谢!!
      

  4.   

    (:ID,:Wavenumber,:Intensity)这就是我的列名啊,不是写在后面吗?
      

  5.   

        if ADOQuery1.RecordCount>0 then
              maxID:=ADOQuery1.Fields.Fields[0].AsInteger
            else
              maxID:=0; //原来为1,应该改为0
      

  6.   

    把ADOQuery1里的field全部先清除掉
      

  7.   

     sql.add('select max(ID) as ID from spectrum '); 执行这句后你的ADOQuery1只有一个field 就是ID,你双击ADOQuery1,把里面的field先清除掉,或都你删掉ADOQuery1,再重新拖一个ADOQuery进来
      

  8.   


    with ADOQuery1 do 
        try 
          begin 
            close;  
            sql.text := 'select max(ID) as ID from spectrum ';//取字段ID的最大值  
            Open;--------错误出现 
            if ADOQuery1.RecordCount>0 then 
              maxID:=ADOQuery1.Fields.Fields[0].AsInteger 
            else 
              maxID:=1;  
          end; 
      for i:=0 to 2090 do 
    begin
      try
        adoconnection1.BeginTrans;
        adoquery1.append;
        fieldbyname('ID').value := maxID+1; 
        fieldbyname('Wavenumber').value := arrwave[i]; 
        fieldbyname('Intensity').value := arrintensity[i];
        adoquery1.post;
        adoquery1.next;
        ADOConnection1.CommitTrans   ;
        showmessage('done');  
      except
        begin
          showmessage('同步出错');
          ADOConnection1.RollbackTrans   ; 
        end;
      end;
      

  9.   


          ......
          begin 
            close; 
            sql.Clear; 
            sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:ID,:Wavenumber,:Intensity)');   //这句修改一下
            for i:=0 to 2090 do 
            begin 
              Parameters.ParamByName('ID').Value:=maxID+1; 
              Parameters.ParamByName('Wavenumber').Value:=arrwave[i]; 
              Parameters.ParamByName('Intensity').Value:=arrintensity[i]; 
              try 
                prepared; 
                ExecSQL; 
                ShowMessage('成功');     //这句放这里有问题的, 最多可能会弹出2091次对话框
              except 
                on e: Exception do 
                begin 
                  ShowMessage('出错'); 
                end; 
              end; 
            end; 
          end; 
      

  10.   


    with ADOQuery1 do 
        try 
          begin 
            close; 
            sql.Clear; 
            sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值 
            //    prepared; 
            Open;--------错误出现 
            if ADOQuery1.RecordCount>0 then 
              maxID:=ADOQuery1.Fields.Fields[0].AsInteger 
            else 
              maxID:=1; 
            ADOQuery1.close;       end; 
          begin 
            close; 
            sql.Clear; 
            sql.add('insert into spectrum values(:ID,:Wavenumber,:Intensity)'); 
            //  ('insert into spectrum(ID,:Wavenumber,:Intensity)values(ID,Wavenumber,Intensity))
            for i:=0 to 2090 do 
            begin 
              Parameters.ParamByName('ID').Value:=maxID+1; 
              Parameters.ParamByName('Wavenumber').Value:=arrwave[i]; 
              Parameters.ParamByName('Intensity').Value:=arrintensity[i]; 
              try 
                prepared; 
                ExecSQL; 
                ShowMessage('成功'); 
              except 
                on e: Exception do 
                begin 
                  ShowMessage('出错'); 
                end; 
              end; 
            end; 
          end; 
        finally; 
        end; //end with
      

  11.   

    你是不是有固定字段Wavenumber,或者filter里有过滤条件,使用了Wavenumber,代码上没什么大问题
      

  12.   

    'ADOquery1:Field'Wavenumber'not found'.,在ADOQuery1里没有'Wavenumber'这个字段。
      

  13.   

     這是你傳的參數,最簡單的方法就是你貼出spectrum  的表結構就不用大家再猜了。
     還有你一定要搞清楚參數跟字段完全是二回事。
      

  14.   

    哥哥们,我的spectrum表的字段名为ID,Wavenumber,Intensity
      

  15.   

    在我的ADOQuery1里面有Wavenumber字段,里面一共有三个字段ID,Wavenumber,Intensity
      

  16.   

    [Quote=引用 3 楼 wateringght 的回复:]
    还有麻烦个高手哥哥,我的这段程序实现的是  往数据表中写入横纵坐标,有三个字段:ID,Wavenumber--横,Intensity--纵,共有2090组数据,ID是我的横纵坐标生成图的编号,即2090组数据应具有相同的ID,请高手哥哥看看代码写的对吗???多谢多谢多谢!!
    [/Quote我的2090组数据(Wavenumber-横坐标,Intensity-纵坐标)分别存放在arrwave和arrintensity两个数组中,我要把这两个数组的值分别写进表字段wavenumber和intensity中,是这个样子的~~~~~~我表达好像有问题,请哥哥们见谅~~~
      

  17.   


      with ADOQuery1 do 
        try 
          begin 
            close; 
            sql.Clear; 
            sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值 
            //    prepared; 
            Open;--------错误出现 
            if ADOQuery1.RecordCount>0 then 
              maxID:=ADOQuery1.Fields.Fields[0].AsInteger 
            else 
              maxID:=1; 
            ADOQuery1.close;       end; 
          begin 
            close; 
            sql.Clear; 
            sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:ID,:Wavenumber,:Intensity)'); 
            for i:=0 to 2090 do 
            begin 
              Parameters.ParamByName('ID').Value:=maxID+1; 
              Parameters.ParamByName('Wavenumber').Value:=arrwave[i]; 
              Parameters.ParamByName('Intensity').Value:=arrintensity[i]; 
              try 
                prepared; 
                ExecSQL; 
                ShowMessage('成功'); 
              except 
                on e: Exception do 
                begin 
                  ShowMessage('出错'); 
                end; 
              end; 
            end; 
          end; 
        finally; 
        end; //end with
      

  18.   

     with ADOQuery1 do 
        try 
          begin 
            close; 
            sql.Clear; 
            sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值 
            //    prepared; 
            Open;--------错误出现 
            if ADOQuery1.RecordCount>0 then 
              maxID:=ADOQuery1.Fields.Fields[0].AsInteger 
            else 
              maxID:=1; 
            ADOQuery1.close;       end;  取最大值時換一個QUERY,認真看了下,應該是你將這個數據集靜態化了字段了。
      

  19.   

    还是老样子的错误~~~~
    提示错误:Project a2.exe raised exception class EDatabaseError with message'ADOquery1:Field'Wavenumber'not found'. 
    我是单步运行,在运行完 
    sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值 
            //    prepared; 
            Open;--------错误出现 
      

  20.   


    如果 2090组数据要有相同的ID  ,相同的(Wavenumber-横坐标,Intensity-纵坐标) 
    那么上面的一个就可以解难决 
    如果 说其中一条出错要全部回滚的话 就把 For to Do 放到 adoconnection1.BeginTrans; 后面 
      

  21.   


     我的意思是讓你再放一個ADOQUERY控件來取ID的最大值,不要再用ADOQUERY1, 因為ADOQUERY1的 fields  已經讓你靜態化了字段。
      

  22.   

    相同的ID,不同的(Wavenumber-横坐标,Intensity-纵坐标)值,可是我还没有运行到那里就已经出错了~~~~会是后面的问题吗?
      

  23.   


    领会了starluck ,你真牛!!以下是我改的,你看这回对了吧?    with ADOQueryID do
        try
          begin
            close;
            sql.Clear;
            sql.add('select max(ID) as ID from spectrum ');
            //     prepared;
            Open;
            if ADOQueryID.RecordCount>0 then
              maxID:=ADOQueryID.Fields.Fields[0].AsInteger
            else
              maxID:=1;
            h:=maxID+1;
            ADOQueryID.close;
          end;      with ADOQuery1 do
          begin
            close;
            sql.Clear;
            sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:h,:arrwave[i],:arrintensity[i])');
            for i:=0 to 2090 do
            begin
                  Parameters.ParamByName('ID').Value:=h;
                  Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
                  Parameters.ParamByName('Intensity').Value:=arrintensity[i];
                  try
                    prepared;
                    ExecSQL;
                    ShowMessage('成功');
                  except
                    on e: Exception do
                    begin
                      ShowMessage('出错');
                    end;
                  end;
                end;  
      

  24.   

    with ADOQueryID do 
        try 
          begin 
            close; 
            sql.Clear; 
            sql.add('select isNull(max(ID),1) as ID from spectrum '); 
            Open; 
            if ADOQueryID.RecordCount>0 then 
              maxID:=ADOQueryID.Fields.Fields[0].AsInteger 
            else 
              maxID:=1;   // 這二行有點怪。如果為空即為1,那麼就不應該再需要相加了,也就是說如果在空表的情況你這個SQL會出ID號跳一個號的情況。其它目前沒有發現什麼問題。
            h:=maxID+1; 
            ADOQueryID.close; 
          end;       with ADOQuery1 do 
          begin 
            close; 
            sql.Clear; 
            sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:h,:arrwave[i],:arrintensity[i])'); 
            for i:=0 to 2090 do 
            begin 
                  Parameters.ParamByName('ID').Value:=h; 
                  Parameters.ParamByName('Wavenumber').Value:=arrwave[i]; 
                  Parameters.ParamByName('Intensity').Value:=arrintensity[i]; 
                  try 
                    prepared; 
                    ExecSQL; 
                    ShowMessage('成功'); 
                  except 
                    on e: Exception do 
                    begin 
                      ShowMessage('出错'); 
                    end; 
                  end; 
                end;  
      

  25.   

       运行到这步有问题      Parameters.ParamByName('ID').Value:=h; Project a2.exe raised exception class EDatabaseError with message'ADOquery1:parameter'ID'not found'. ~~~~~是怎么回事??
      

  26.   

       运行到这步有问题      Parameters.ParamByName('ID').Value:=h; Project a2.exe raised exception class EDatabaseError with message'ADOquery1:parameter'ID'not found'. ~~~~~是怎么回事??
      

  27.   


    是有问题~~~~慧眼!修改后应该是这个个样子,但是楼上的错误还是存在~~~~~ 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;
          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
                  Parameters.ParamByName('ID').Value:=maxID;
                  Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
                  Parameters.ParamByName('Intensity').Value:=arrintensity[i];
                  try
                    prepared;
                    ExecSQL;
                    ShowMessage('成功');
                  except
                    on e: Exception do
                    begin
                      ShowMessage('出错');
                    end;
                  end;
                end;  
      

  28.   


    with ADOQueryID do 
        try 
          begin 
            close; 
            sql.Clear; 
            sql.add('select isNull(max(ID),1) as ID from spectrum '); 
            Open; 
            if ADOQueryID.RecordCount>0 then 
              maxID:=ADOQueryID.Fields.Fields[0].AsInteger 
            else 
              maxID:=1;   // 這二行有點怪。如果為空即為1,那麼就不應該再需要相加了,也就是說如果在空表的情況你這個SQL會出ID號跳一個號的情況。其它目前沒有發現什麼問題。
            h:=maxID+1; 
            ADOQueryID.close; 
          end;       with ADOQuery1 do 
          begin 
            close; 
            sql.Clear; 
            sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:A,:B,:C)'); 
            for i:=0 to 2090 do 
            begin 
                  Parameters.ParamByName('A').Value:=h; 
                  Parameters.ParamByName('B').Value:=arrwave[i]; 
                  Parameters.ParamByName('C').Value:=arrintensity[i]; 
                  try 
                    prepared; 
                    ExecSQL; 
                    ShowMessage('成功'); 
                  except 
                    on e: Exception do 
                    begin 
                      ShowMessage('出错'); 
                    end; 
                  end; 
                end;   真差點讓你氣死。
    參數的名字一點要對應上
      

  29.   


    不過你的二個SHOWMESSAGE你最好根據你的需要改進下,不然2090次提示,人會瘋掉的。
      

  30.   

    多谢starluck 活雷锋了!!!!