with form1.ADOQueryWhiteList do 
  begin 
    DisableControls; 
    Connection := form1.ADOConnection1; 
    for i := 0 to form1.DBGridEh7.SelectedRows.Count - 1 do 
    begin 
      form1.DBGridEh7.DataSource.DataSet.GotoBook(pointer(form1.DBGridEh7.SelectedRows.Items[i])); 
      if form1.DBGridEh7.DataSource.DataSet.FieldValues['White_Keyword'] <> Null then 
        s1 := form1.DBGridEh7.DataSource.DataSet.FieldValues['White_Keyword'] 
      else 
        s1 := ''; 
    begin 
       form1.ADOQueryWhiteList.SQL.Clear;
       sSql := 'update DNSCACHE set Levels =:Levels where DNSCACHE.Domain like :White_Keyword'; ;
      form1.ADOQueryWhiteList.SQL.Text := sSql;
        Parameters.ParamByName('Levels').Value := 'W'; 
        Parameters.ParamByName('White_Keyword').Value := s1; 
        try 
          Prepared := True; 
          ExecSQL; 
        except 
        end; 
      end; 
    end; 
  Form1.DBGridEh7.selectedrows.clear; 
      EnableControls; 
    Application.MessageBox('对比完成','对比',MB_OK); 
  end; 
end; 
含义:WhiteList表里White_Keyword模糊字段逐行和DNSCACHE 表里的Domain字段比较,相同符合条件的记录在DNSCACHE表里的Levels字段变成W 
只能针对单条记录操作,如针对多条记录进行操作时候 
出现: 
ADOQueryWhiteList: cannot perform this operation on a closed dataset 
的错误,逐条运行后,发现 
  end; 
  Form1.DBGridEh7.selectedrows.clear; 
运行end后就出错. 
请指点.谢谢

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: integer;
      s1,sSql: String;
    begin
      with ADOQueryWhiteList do
      begin
        DisableControls;
        Connection := ADOConnection1;
        for i := 0 to DBGridEh7.SelectedRows.Count - 1 do
        begin
          DBGridEh7.DataSource.DataSet.GotoBook(pointer(DBGridEh7.SelectedRows.Items[i]));
          if DBGridEh7.DataSource.DataSet.FieldValues['White_Keyword'] <> Null then
            s1 := form1.DBGridEh7.DataSource.DataSet.FieldValues['White_Keyword']
          else
            s1 := '';
          with AdoQuery2 do  //如果你根据s1去更新,不要使用原来的adoquery,用一个新的
          begin
            try
              Close;
              sSql := 'update DNSCACHE set Levels =:Levels where DNSCACHE.Domain like :White_Keyword'; ;
              SQL.Text := sSql;
              Parameters.ParamByName('Levels').Value := 'W';
              Parameters.ParamByName('White_Keyword').Value := s1;
              Prepared := True;
              ExecSQL;
            except
            end;
          end;
        end;
        DBGridEh7.selectedrows.clear;
        EnableControls;
        Application.MessageBox('对比完成','对比',MB_OK);
      end; 
    end;其实如果能够根据一个关键字来更改,可以用
    adoquery1.edit;
    adoquery1.fieldByname('levels').value := 'W';
    adoquery1.post;
    这种方式来修改
      

  2.   

    with AdoQuery2 do  //如果你根据s1去更新,不要使用原来的adoquery,用一个新的 
    这样操作后会提示
    AdoQuery2 找不见'levels'
      

  3.   

    AdoQuery2 与数据库关联了吗?
      

  4.   

    关联了还是不行,大哥,我觉得不应该再用另一个ADOQUERY了吧
    我修改了下:
       begin 
        Connection := form1.ADOConnection1; 
        for i := 0 to form1.DBGridEh7.SelectedRows.Count - 1 do 
        begin 
          form1.DBGridEh7.DataSource.DataSet.GotoBook(pointer(form1.DBGridEh7.SelectedRows.Items[i])); 
          if form1.DBGridEh7.DataSource.DataSet.FieldValues['White_Keyword'] <> Null then 
            s1 := form1.DBGridEh7.DataSource.DataSet.FieldValues['White_Keyword'] 
          else 
            s1 := ''; 
    with form1.ADOQueryWhiteList do
        begin 
              DisableControls; 
          form1.ADOQueryWhiteList.SQL.Clear; 
          sSql := 'update DNSCACHE set Levels =:Levels where DNSCACHE.Domain like :White_Keyword'; ; 
          form1.ADOQueryWhiteList.SQL.Text := sSql; 
            Parameters.ParamByName('Levels').Value := 'W'; 
            Parameters.ParamByName('White_Keyword').Value := s1; 
            try 
              Prepared := True; 
              ExecSQL; 
            except 
            end; 
          EnableControls; 
          end; 
        end; 
      Form1.DBGridEh7.selectedrows.clear; 
        Application.MessageBox('对比完成','对比',MB_OK); 
      end; 
    end; 
    提示:list index out of bounds (1)
    请指点