问题:报错 ADOQuery2:Cannot perform this operation on a closed 求教,各位大神指点一下吧,附以下代码
描述:

delphi代码

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids,shellAPI, ComCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    Label2: TLabel;
    ADOQuery2: TADOQuery;
    Button1: TButton;
    ADOQuery3: TADOQuery;
    ProgressBar1: TProgressBar;
    ProgressBar2: TProgressBar;
    label4: TLabel;
    Label3: TLabel;
    ProgressBar3: TProgressBar;
    Label1: TLabel;
    ComboBox1: TComboBox;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  si:integer;
implementation
{$R *.dfm}
function hextodec(hstr: string): int64;
var
  i,len:integer;
  nowdec,tmp:int64;
begin
   nowdec:=0;
   len:=length(hstr);
    for i:=1 to   len do
    begin
       case hstr[i] of
         '0':tmp:=0;
         '1':tmp:=1;
         '2':tmp:=2;
         '3':tmp:=3;
         '4':tmp:=4;
         '5':tmp:=5;
         '6':tmp:=6;
         '7':tmp:=7;
         '8':tmp:=8;
         '9':tmp:=9;
         'A','a':tmp:=10;
         'B','b':tmp:=11;
         'C','c':tmp:=12;
         'D','d':tmp:=13;
         'E','e':tmp:=14;
         'F','f':tmp:=15;
       end;
       nowdec:=nowdec*16+tmp
   end;
   hextodec:=nowdec;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ITN,MAC:String;
WO,WODATE:String;
status1: string;  //定义状态,方便获取RELEASE_SERVEL表中的状态
WOarray: array[0..30000] of string;
TYPEarray: array[0..30000] of string;
STarray: array[0..30000] of string;
EDarray: array[0..30000] of string;
TIarray: array[0..30000] of string;
MOarray: array[0..30000] of string;
N,WOcount,itemcount,m,i,j:integer;
SMAC,EMAC:int64;
begin
  timer1.Enabled:=false;
  progressbar1.position:=0;
  progressbar2.position:=0;
  //progressbar3.position:=0;
  si:=1;
  //adoquery2.SQL.Clear;
  //adoquery2.SQL.Add('delete from SAJET.E_SIGNAGE_TRANFER  ');
  //adoquery2.ExecSQL;
  adoquery2.SQL.Clear;
  adoquery2.SQL.Add('select WORK_ORDER AS WO,TURN_TYPE AS TYPE,MACID_START AS ST,MACID_END AS ED,MULTIPLES AS TI,MODEL_ID AS MO  from '
                    +'(SELECT K.WORK_ORDER,J.TURN_TYPE,K.MACID_START,K.MACID_END,J.MULTIPLES,K.MODEL_ID  '
                    +'FROM SAJET.G_WO_BASE K,SAJET.CAMEO_PART_BASE J  '
                    +'WHERE K.MACID_END IS NOT NULL '
                    +' and K.WORK_ORDER not like''F%''   '       //--2014.6.13add han
                    +' and K.WORK_ORDER not like''TEST%''  '        //--2014.7.15add han
                    +'AND K.MACID_END<> ''N/A''  '
                    +'AND K.WO_STATUS IN (''2'',''3'')  '
                    +'AND K.WO_CREATE_DATE > to_date(''2014/04/01 00:00:01'',''YYYY/MM/DD HH24:MI:SS'')  '    //--2014.6.13update han
                    +'AND K.MODEL_ID=J.PART_NO  '
                    +'AND K.MACID_END NOT IN (SELECT END FROM SAJET.CAMEO_RELEASE_SERVEL L) '
                    +'AND K.MACID_START  NOT IN (SELECT L.STA FROM SAJET.CAMEO_RELEASE_SERVEL L) '
                    +'UNION ALL  '
                    +'SELECT K.WORK_ORDER,J.TURN_TYPE,K.MACID_START_2,K.MACID_END_2,J.MULTIPLES,K.MODEL_ID '
                    +'FROM SAJET.G_WO_BASE K,SAJET.CAMEO_PART_BASE J '
                    +'WHERE K.MACID_END_2 IS NOT NULL  '
                    +' and K.WORK_ORDER not like''F%''  '   //--2014.6.13add han
                    +' and K.WORK_ORDER not like''TEST%''  '        //--2014.7.15add han
                    +'AND K.MACID_END_2<> ''N/A''  '
                    +'AND K.WO_STATUS IN (''2'',''3'')  '
                    +'AND K.WO_CREATE_DATE > to_date(''2014/04/01 00:00:01'',''YYYY/MM/DD HH24:MI:SS'')  '        //--2014.6.13update han
                    +'AND K.MODEL_ID=J.PART_NO  '
                    +'AND K.MACID_END_2 NOT IN (SELECT END FROM SAJET.CAMEO_RELEASE_SERVEL L) '
                    +'AND K.MACID_START_2 NOT IN (SELECT L.STA FROM SAJET.CAMEO_RELEASE_SERVEL L)) ');
  ADOQUERY2.Open;
  if ADOQUERY2.RecordCount<>0 then
  begin
   m := 0;
      repeat
        WOcount :=ADOQuery2.RecordCount;
        WOarray[m] := ADOQuery2.FieldValues['WO'];
        TYPEarray[m] := ADOQuery2.FieldValues['TYPE'];
        STarray[m] := ADOQuery2.FieldValues['ST'];
        EDarray[m] := ADOQuery2.FieldValues['ED'];
        TIarray[m] := ADOQuery2.FieldValues['TI'];
        MOarray[m] := ADOQuery2.FieldValues['MO'];
        m := m + 1;
        ADOQuery2.Next;
      until ADOQuery2.eof;
    for m := 0 to WOcount do
    begin
      if woarray[m] <> '' then
      begin
        progressbar1.Min:=1;
        progressbar1.Max:=WOcount;
        progressbar1.Position:=m;
        Application.ProcessMessages;
        ADOQuery2.close;
        adoquery2.SQL.Clear;
        adoquery2.SQL.Add('insert into SAJET.CAMEO_RELEASE_SERVEL R (R.WO,R.TYPE,R.STA,R.END,R.STATUS,R.TIMES)  '
                         +'values ('''+WOarray[m]+''','''+TYPEarray[m]+''','''+STarray[m]+''','''+EDarray[m]+''',''N'','''+TIarray[m]+''')  ');
        adoquery2.ExecSQL;
        //SMAC :=UpperCase(HexToDec(STarray[m]));
        //EMAC :=UpperCase(HexToDec(EDarray[m]));
        //SMAC :=strtoint('$'+STarray[m]);
        //EMAC :=strtoint('$'+EDarray[m]);
        N:=StrToInt(TIarray[m]);
        MAC := STarray[m];
        ITN:='mac'+ MOarray[m];
        for i := 0 to EMAC-SMAC do
        begin
          if SMAC <= EMAC then
          begin
            ADOQuery2.close;
            adoquery2.SQL.Clear;
            adoquery2.SQL.Add('SELECT * FROM SAJET.G_BID_INFO WHERE ITEM_NO='''+MAC+'''');
            if adoquery2.RecordCount>0 then
            begin
              ADOQuery2.close;
              adoquery2.SQL.Clear;
              adoquery2.SQL.Add('INSERT INTO SAJET.CAMEO_RELEASE_SERVEL(WO,TYPE,STA,END,STATUS) VALUES('''+WOarray[m]+''','''+TYPEarray[m]+''','''+MAC+''',''DUP'',''N'')');
              adoquery2.ExecSQL;
            end
            else
            begin
              //i:=1;
              ADOQuery2.close;
              adoquery2.SQL.Clear;
              adoquery2.SQL.Add('insert into SAJET.G_BID_INFO P ('
                  +'P.LOT_NO,P.ITEM_NAME,P.ITEM_NO,P.REMARK,P.STATUS) '
                  +'values('+''''+WOarray[m]+''''+','+''''+ITN+''''+','+''''+mac+''''+',''PR'',''N'' )');
              adoquery2.ExecSQL;
            end;
            SMAC := N + SMAC;
            MAC := inttohex(SMAC,12);
            progressbar2.Min:=1;
            progressbar2.Max:=EMAC-SMAC+2;
            progressbar2.Position:=i;
            //i:=i+1;
            Application.ProcessMessages;
          end;
        end;
         ADOQuery2.close;
         adoquery2.SQL.Clear;
         adoquery2.SQL.Add('update SAJET.CAMEO_RELEASE_SERVEL  t set  t.STATUS=''Y'' , t.utime=sysdate  '
                            +'Where T.WO=' + '''' + WOarray[m] + '''' + ' '
                            +'AND end=' + '''' + EDarray[m] + '''' + ' ');
         adoquery2.ExecSQL;
                  // 记录大於0  向CAMEO_RELEASE_SERVEL表中插入状态为N 如果小於0 就像G_BID_INFO表中插入数据, info表中有数据之後,
                  //把RELEASE_SERVEL表中状态变为Y
         //然後把状态设置为Y
      end;
      Adoquery2.Close;
      Adoquery2.SQL.Clear;
      Adoquery2.SQL.Add('SELECT t.status '+' FROM SAJET.CAMEO_RELEASE_SERVEL t '+' where  t.status=''N'' '+' and t.utime>sysdate-2 '+' and T.WO='+' ''' + WOarray[m] + '''');
      ADOQuery2.open;
      //status1:=adoquery2.fieldbyname('status').asstring;
      status1:=Adoquery2.FieldValues['status'];
      if status1='N' then
           begin
              ADOQuery2.close;
              adoquery2.SQL.Clear;
              adoquery2.SQL.Add('insert into SAJET.G_BID_INFO P ('
                 +'P.LOT_NO,P.ITEM_NAME,P.ITEM_NO,P.REMARK,P.STATUS) '
                 +'values('+''''+WOarray[m]+''''+','+''''+ITN+''''+','+''''+mac+''''+',''PR'',''N'' )');
             adoquery2.ExecSQL;
           end;
         ADOQuery2.close;
         adoquery2.SQL.Clear;
         adoquery2.SQL.Add('update SAJET.CAMEO_RELEASE_SERVEL  t set  t.STATUS=''Y'' , t.utime=sysdate  '
                            +'Where T.WO=' + '''' + WOarray[m] + '''' + ' '
                            +'AND end=' + '''' + EDarray[m] + '''' + ' ');
         adoquery2.ExecSQL;
    end;
  end;
  ADOQUERY2.close;
  timer1.Enabled:=true;
  progressbar1.position:=0;
  progressbar2.position:=0;
  progressbar3.position:=0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  label2.Caption:='2014-06-10 V14.6.10';
  timer1.Enabled:=true;
  progressbar3.position:=0;
  si:=1;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
ss:int64;
begin
  ss:=strtoint(trim(combobox1.Text))*120;
  if si<>
  then
  begin
  timer1.Enabled:=true;
  si:=si+1;
  progressbar3.Min:=1;
  progressbar3.Max:=ss;
  progressbar3.Position:=si;
  Application.ProcessMessages;
  end
  else
  begin
  timer1.Enabled:=false;
  Application.ProcessMessages;
  Button1Click(Button1);
  end;
end;
end.
解决方案1:

progressbar1.Min:=1;
progressbar1.Max:=WOcount;
progressbar1.Position:=m;
你这里, P1 最小设置为1,  然  m 是从 0 开始的...
下面这个也是一样, i 也是从0开始的... 
progressbar2.Min:=1;
progressbar2.Max:=EMAC-SMAC+2;
progressbar2.Position:=i;

解决方案2:

同意楼上, 判断前需要先OPEN

解决方案3:

先跟踪一下看看哪句报错的。
感觉应该是下面这段报错吧。
          if SMAC <= EMAC then
          begin
            ADOQuery2.close;
            adoquery2.SQL.Clear;
            adoquery2.SQL.Add('SELECT * FROM SAJET.G_BID_INFO WHERE ITEM_NO='''+MAC+'''');
            if adoquery2.RecordCount>0 then
            begin
上面的第三句close了,第六句却是判断adoquery2.RecordCount>0。
要么不close,要么在判断之前再open。

上一篇请教一个读取文本文档内容的问题,具体如下
下一篇delphi 不断创建线程,销毁线程,程序占用线程却不断增加,有没有朋友遇到并解决问题?
明星图片
相关文章
《报错 ADOQuery2:Cannot perform this operation on a closed 求教,各位大神指点一下吧,附以下代码》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)