下面这段程序当我线程执行时,我不能通过判断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;
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;
解决方案 »
- [[高分醒目]]关于delphi如何封装WinAPI???[[高分醒目]]
- 问一个问题,请大家帮帮我啊!
- delphi中令我很郁闷的问题。
- 我用paradox7作为数据库编个小程序在没有delphi7.0的环境下怎么运行?(
- 请问IIS+CGI或IIS+ISAPI能访问INTERBASE数据库吗?
- 有关Delphi 数据库的报表制作的问题请教??
- 关于ADO的开销
- Delphi6个人版的序列号是什么呀?
- Delphi网络编程高手请进。。。。。
- 内存数据怎么copy
- 请问如何用Windows默认的程序打开文件夹?
- 请问frmTest := TfrmTest.Create(Application)与frmTest := TfrmTest.Create(Self)具体运用有何区别?
if m_Session.Active = False then
m_Session.Active := True; if m_Database.Connected = False then
m_Database.Connected := True;
当我网线down掉时就是不能抓到Except神阿,救救我吧
你可以这样做,
你做一个过程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;