adoquery1查询表t_sell_rec,返回结果显示在dbgrid1中,按钮button1:删除dbgrid1中选种的一条记录,combobox1.item:a、b、c、d;button2:更新t_sell_rec中显示在dbgrid1中记录的字段sell_dollar_type的值,我的代码如下:
for i:=1 to ADOQuery1.RecordCount do
    begin
    ADOQuery2:= TADOQuery.Create(self);
    ADOQuery2.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DataFile+';Persist Security Info=False;';
   ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Text:= 'update t_sell_rec set [sell_dollar_type]= :tt_a where ([coustom_id]='''+ADOQuery1.FieldByName('coustom_id').AsString+''')';
     ADOQuery2.Parameters.ParamByName('tt_a').Value:=trim(combobox1.text)  ADOQuery2.ExecSQL;
end;
可是运行后,更改了所有coustom_id对应的sell_dollar_type值,晕,已经连续搞了6个小时了!各位大虾快久久me!

解决方案 »

  1.   

    ADOQuery2.Parameters.ParamByName('tt_a').Value:=trim(combobox1.text);//忘记了一个‘;’
      

  2.   

    把循环改成用WHILE NOT ADOQUERY1 EOF............ADOQUERY1.NEXT试试
      

  3.   

    你的代码不象你所说的那样运行就是大问题,我们都别作编程了!!!
    在你的for循环中,ADOQuery1.FieldByName('coustom_id').AsString的值均会等于当前行的coustom_id值,那自然会将数据库中所有记录的sell_dollar_type均更新掉。不然系统就有问题,我们的程序还能干吗?不信,你试试将SQL语句显示出来看看:
    var
      SQLStr : string
      i : integer;
    begin
      ADOQuery2:= TADOQuery.Create(self);
      ADOQuery2.Connection := ADOQuery1.Connection;
      for i :=1 to ADOQuery1.RecordCount do
      begin
        ADOQuery2.Close;
        SQLStr := 'update t_sell_rec set [sell_dollar_type]= '
                 + trim(combobox1.text) + ' where ([coustom_id]= '''
                 + ADOQuery1.FieldByName('coustom_id').AsString + ''')';
        ShowMessage(SQLStr);
        ADOQuery2.SQL.Text:= SQLStr;
        ADOQuery2.ExecSQL;
      end;
      ADOQuery2.Free;
    end;
    end;
      

  4.   

    别忘了在循环中加入:
      ADOQUERY1.NEXT;
      

  5.   

    ADOQuery2:= TADOQuery.Create(self);
    ADOQuery2.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DataFile+';Persist Security Info=False;';
    ADOQuery2.SQL.Clear;
    ADOQuery2.SQL.Text:= 'update t_sell_rec set [sell_dollar_type]= :tt_a where ([coustom_id]=:tt_id)';
    ADOQuery2.Prepare;ADOQuery1.First;
    while not ADOQuery1.Eof do
    begin
      ADOQuery2.Parameters.ParamByName('tt_a').Value:=trim(combobox1.text);
      ADOQuery2.Parameters.ParamByName('tt_id').Value:=ADOQuery1.FieldByName('coustom_id').AsString;
      ADOQuery2.ExecSQL;
      ADOQuery1.Next;
    end;
      

  6.   

    不过不知道你是怎么考虑的,要这么来写。
    整个规划就有问题了。以上也只是权宜之计吧,比你原来的代码肯定要快一点。
    最后别忘记了ADOQuery2.Free;
      

  7.   

    ssq237712(流亡帅哥) ,我按照你的代码,还是将所有满足ADOQuery2.Parameters.ParamByName('tt_id').Value:=ADOQuery1.FieldByName('coustom_id').AsString的记录全部更新了,就是说,我从查询结果中删除的记录也被更新了!
      

  8.   

    我也想从dbgrid1的记录中更新,但是我删除部分数据后,用以下代码:
    for i:=1 to ADOQuery1.RecordCount do
                 begin
                 ADOQuery1.edit;
                   ADOQuery1.FieldByName('sell_dollar_type').Value:=t_typ;             
                   ADOQuery1.updatebatch(arall);
                   //ADOQuery1.post
                  ADOQuery1.Next;
                  end;
    那些从dbgrid1中删除的数据也同时被更新了!还是错误!
      

  9.   

    谢谢!从dbgrid1的查询结果中,临时删除一些记录,然后对剩下的数据修改后更新呀!
      

  10.   

    被从查询结果dbgrid1中删除的相关记录不能更新!
      

  11.   

    你是说只是假删除,库里面还是存在的,只是现在不需要更新而已?
    把你删除的代码贴出来看看。一般来说,即使是假删除,ADOQUERY1里也没有这条记录了,否则GRID里会显示的,这样更新也就不存在这个问题了,除非你COLUMN_ID不是唯一索引.
      

  12.   

    COLUMN_ID确实不是唯一的,带吗旧铁
      

  13.   

    删除代码:
    ADOQuery1.locktype:=ltBatchOptimistic;  
    ADOQuery1.Cancel;
      if ADOQuery1.RecordCount>0 then ADOQuery1.Delete;
      

  14.   

    不是唯一的,你在条件后找个唯一的字段啊,把你的PK罗列在后面。ADOQuery2.SQL.Text:= 'update t_sell_rec set [sell_dollar_type]= :tt_a where ([coustom_id]=:tt_id and PK2 = :pk2 and ...)';