我写了两个procedure,目的是想实现,在form打开时通过一个adoquery1查询一个表中所有记录,同时,把表中的一个字段赋给你个数组,然后把其中一个字段值传给另外一个adoqueryanswer,列出一些选项.选中一个选项再把选项值赋给另外一个数组,这样通过两个数组查询记录,就是类似于一个问卷调查系统.两个procedure代码如下:
var
  Form1: TForm1;
  arrayfield:array of string;
  arrayvalue:array of Integer;procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
   var strQuestID,strQuestValue :string ;begin with ADOQuery1 do
   begin        strQuestID := Fieldbyname('QuestID').asstring;
        ADOQueryAnswer.SQL.Clear;
        ADOQueryAnswer.SQL.Add('select * from QuestionAnswer where QuestID='+strQuestID);
        ADOQueryAnswer.Open;
        RadioGroup1.Items.Clear;
        while not AdoQueryAnswer.Eof  do
            begin
            strQuestValue:= ADOQueryAnswer.FieldByName('QuestValue').AsString;
            RadioGroup1.Items.Add(strQuestValue);
            AdoQueryAnswer.next;
            end;
            RadioGroup1.Items.Add('不选');
            RadioGroup1.ItemIndex:= RadioGroup1.Items.Count-1;
            Edit1.Text:=RadioGroup1.Items.Strings[RadioGroup1.ItemIndex];
   endend;
procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
 var i:Integer;
begin
   ADOQuery1.Open;
   SetLength(arrayfield,ADOQuery1.RecordCount);
   SetLength(arrayvalue,ADOQuery1.RecordCount);    for i := Low(arrayfield) to High(arrayfield) do
        begin
          while not Adoquery1.Eof do
            begin
      //    arrayfield[i] := ADOQuery1.FieldValues['ErrorAttri'];
            arrayvalue[i] := 0;
            arrayfield[i] :=Adoquery1.FieldByName('ErrorAttri').AsString;
            showmessage(arrayfield[i]);
            ADoquery1.Next;
            end;
        end;end;
这两个procedure不同时用就没有错误,但是同时用系统报错ADOQueryAnswer:Cannot perform this operation on an open dataset.请指教

解决方案 »

  1.   

    adoquery你在open以前先来一句:query.close;
      

  2.   

    procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
     var i:Integer;
    begin
    // ADOQuery1.Open;
       试试
       SetLength(arrayfield,ADOQuery1.RecordCount);
       ....
    end;
      

  3.   

    procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
     var i:Integer;
    begin
    // ADOQuery1.Open;
    .......AfterOpen以后,为何还要Open;?
      

  4.   

    去掉//ADOQuery1.Open;也没有用,还是出现那样的错误
      

  5.   

    ADOQueryAnswer.Close;//加上这个
    ADOQueryAnswer.SQL.Clear;AdoQueryAnswer.First;//再加上这个
    while not AdoQueryAnswer.Eof  do使用的一般步骤:
    Close;
    SQL.Clear;
    SQL.Add('select ...');
    Open;
    First;
    while not Eof do
    begin
      ...
      Next;
    end;