下面这段程序当我线程执行时,我不能通过判断m_Database.Connected 是否为真来判断网络是否断掉?
unit ThreadUnit;interfaceuses
  SysUtils, DateUtils, Windows, Classes, DBTables, DB, Forms;type  TExeStoredprocThread = class(TThread)
  private
    m_Session: TSession;
    m_Database: TDatabase;
    m_StoredProc: TStoredProc;
    m_Query: TQuery;
    ExeResult: String;
    BdeError: String;
    ControlCode: boolean;
  protected
    procedure Execute; override;
  public
    Constructor Create(Suspended: boolean);virtual;
    procedure UpdateUIOnStart; virtual;
    procedure UpdateUIOnEnd; virtual;
    procedure Onterminatedo(Sender: TObject); virtual;
    procedure CheckControlCode; virtual;
  end;implementationuses
  MainUnit;procedure TExeStoredprocThread.CheckControlCode;
begin
   ControlCode:=CalForm.IsExit;
end;constructor TExeStoredprocThread.Create(Suspended: boolean);
begin
   inherited create(Suspended);   self.OnTerminate:=Onterminatedo;
   FreeOnterminate:=true;   m_Session:= TSession.Create(Application);
   m_Session.KeepConnections:=true;
   m_Session.Name := 'Session11';
   m_Session.SessionName := 'Ses11';
   m_Session.Active := True;   m_Database := TDataBase.Create(Application);
   m_Database.DriverName:='ORACLE';
   m_Database.Params.Add('SERVER NAME=SFC');
   m_Database.Params.Add('USER NAME=SFIS');
   m_Database.Params.Add('PASSWORD=SFIS');
   m_Database.SessionName:=m_Session.SessionName;
   m_Database.LoginPrompt:=false;
   m_Database.KeepConnection:=true;
   m_Database.Name := 'DataBase11';
   m_Database.DatabaseName := 'DB1';
   m_Database.Connected := True;   m_StoredProc:=TStoredProc.Create(Application);
   m_StoredProc.Name:='StoredProc11';
   m_StoredProc.StoredProcName:='SFIS1.HZ_SEND_SMS3';
   m_StoredProc.SessionName:=m_Session.SessionName;
   m_StoredProc.DatabaseName:=m_Database.DatabaseName;   m_Query := TQuery.Create(Application);
   m_Query.Name := 'Query11';
   m_Query.SessionName := m_Session.SessionName;
   m_Query.DatabaseName := m_Database.DatabaseName;   m_Query.Close;
   m_Query.SQL.Clear;
   m_Query.SQL.Add('select * from sfis1.c_look_board_t');
   m_Query.Open;   ControlCode:=false;
   ExeResult:='OK';
   BdeError:='';
end;procedure TExeStoredprocThread.Execute;
begin
   While not ControlCode do
   begin
      Synchronize(UpdateUIOnStart);      try
        if m_Session.Active = False then
           m_Session.Active := True;        if m_Database.Connected = False then
           m_Database.Connected := True;        if not m_StoredProc.Prepared then
        begin
          m_StoredProc.Prepare;
        end;        m_StoredProc.ExecProc;
        ExeResult:=m_StoredProc.ParamByName('Res').AsString;        m_Query.Close;
        m_Query.SQL.Clear;
        m_Query.SQL.Add('select * from sfis1.c_look_board_t');
        m_Query.Open;
      except on e:EDBEngineError do
      begin
        BdeError:=e.Message;
        ExeResult:='FALSE';
        application.MessageBox(pchar(e.Message),pchar('Error'),MB_OK);
        //ControlCode:=true;
      end
      else
        BdeError:='Error that not BDEError is raised ';
        ExeResult:='FALSE';
        //ControlCode:=true;
      end;      Synchronize(UpdateUIOnEnd);      Synchronize(CheckControlCode);
      if not ControlCode then
         Suspend;
      Synchronize(CheckControlCode);
   end;
end;procedure TExeStoredprocThread.Onterminatedo(Sender: TObject);
begin
   if Assigned(m_Query) then
     m_Query.Free;   if Assigned(m_Storedproc) then
     m_Storedproc.Free;   if Assigned(m_Database) then
     m_Database.Free;   if Assigned(m_Session) then
     m_Session.Free;
end;procedure TExeStoredprocThread.UpdateUIOnEnd;
begin
   CalForm.StatusLabel.Caption:='執行存儲過程  "'+m_StoredProc.StoredProcName+'"  結束:  '+formatdatetime('yyyy-mm-dd:hh/mm/ss',now);   CalForm.UpdateBarTimer.Enabled:=false;
   CalForm.StatusProgressBar.Position:=100;   CalForm.Endtime:=now;
   CalForm.Memo1.Lines.Add('執行結束:'+formatdatetime('yyyy-mm-dd:hh/mm/ss',CalForm.Endtime));
   CalForm.Memo1.Lines.Add('執行時錯誤: '+BdeError);
   CalForm.Memo1.Lines.Add('執行結果: '+ExeResult);
   CalForm.Memo1.Lines.Add('  ');   CalForm.DataSource1.DataSet:=m_Query;
end;procedure TExeStoredprocThread.UpdateUIOnStart;
begin
   CalForm.StatusLabel.Caption:='執行存儲過程  "'+m_StoredProc.StoredProcName+'"  開始:  '+formatdatetime('yyyy-mm-dd:hh/mm/ss',now);   CalForm.UpdateBarTimer.Enabled:=false;
   CalForm.StatusProgressBar.Position:=0;
   CalForm.UpdateBarTimer.Interval:=MilliSecondsBetween(CalForm.Starttime,CalForm.Endtime) div 50;
   CalForm.UpdateBarTimer.Enabled:=true;   CalForm.DataSource1.DataSet:=m_Query;   CalForm.Starttime:=now;
   BdeError:='無';
   CalForm.Memo1.Lines.Add('開始執行:'+formatdatetime('yyyy-mm-dd:hh/mm/ss',CalForm.Starttime));
end;

解决方案 »

  1.   

    请帮我看看Execute里面的语句
            if m_Session.Active = False then
               m_Session.Active := True;        if m_Database.Connected = False then
               m_Database.Connected := True;
    当我网线down掉时就是不能抓到Except神阿,救救我吧
      

  2.   

    我想应该可以抓到exception.
    你可以这样做,
    你做一个过程procedure myexception(Sender:TObject;E:exception);
    begin
    showmessage(E.clssname+E.message);//在这里捕获。
    end;procedure Formcreate(Sender:TObject);
    begin
    //add this line
    Application.Onexception:=myException;
    end;
      

  3.   

    不对吧,onexception是一个TExceptionEvent属性,不能把一个过程赋给他