I am developing a console application which has to reconnect to the oracle database if the connection lost.
But the TOraAlerter always raises an exception with an message dialog and don't use the OnError event of the TOraSession.
What can I do to prevent the TOraAlerter from raising the exception and use the OnError Event from the TOraSession?
I have a small test console application for TOraAlerter:
Code: Select all
program OraAlerterTest;
//------------------------------------------------------------------------------
{$APPTYPE CONSOLE}
//------------------------------------------------------------------------------
uses
SysUtils, Forms, DB, DBAccess, Ora, OraAlerter;
//------------------------------------------------------------------------------
type
TTestClass = class(TObject)
private
FOraAlerter: TOraAlerter;
FOraSession: TOraSession;
procedure DoAfterConnect(Sender: TObject);
procedure DoAfterDisconnect(Sender: TObject);
procedure DoOnError(Sender: TObject; E: EDAError; var Fail: Boolean);
procedure DoOnEvent(Sender: TObject; Event, Message: string);
public
constructor Create;
destructor Destroy; override;
procedure MainLoop;
end;
//------------------------------------------------------------------------------
constructor TTestClass.Create;
begin
inherited;
try
Self.FOraSession:=TOraSession.Create(NIL);
Self.FOraSession.Username:='scott';
Self.FOraSession.Password:='tiger';
Self.FOraSession.Server:='PROD.LOCAL';
Self.FOraSession.AfterConnect:=Self.DoAfterConnect;
Self.FOraSession.AfterDisconnect:=Self.DoAfterDisconnect;
Self.FOraSession.OnError:=Self.DoOnError;
Self.FOraAlerter:=TOraAlerter.Create(Self.FOraSession);
Self.FOraAlerter.Session:=Self.FOraSession;
Self.FOraAlerter.Events:='TEST_PIPE';
Self.FOraAlerter.EventType:=etPipe;
Self.FOraAlerter.TimeOut:=-1;
Self.FOraAlerter.OnEvent:=Self.DoOnEvent;
WriteLn('Connecting...');
Self.FOraSession.Connect;
Self.FOraAlerter.Active:=True;
except
on E: Exception do
begin
WriteLn('Exception Create: '+E.Message);
end;
end;
end;
//------------------------------------------------------------------------------
destructor TTestClass.Destroy;
begin
try
WriteLn('Disconnecting...');
Self.FOraAlerter.Active:=False;
Self.FOraSession.Disconnect;
finally
FreeAndNil(Self.FOraAlerter);
FreeAndNil(Self.FOraSession);
end;
inherited;
end;
//------------------------------------------------------------------------------
procedure TTestClass.DoAfterConnect(Sender: TObject);
begin
WriteLn('Connected');
end;
//------------------------------------------------------------------------------
procedure TTestClass.DoAfterDisconnect(Sender: TObject);
begin
WriteLn('Disconnected');
end;
//------------------------------------------------------------------------------
procedure TTestClass.DoOnError(Sender: TObject; E: EDAError; var Fail: Boolean);
begin
WriteLn('Error');
end;
//------------------------------------------------------------------------------
procedure TTestClass.DoOnEvent(Sender: TObject; Event, Message: string);
begin
WriteLn('PipeMsg="'+Message+'"');
end;
//------------------------------------------------------------------------------
procedure TTestClass.MainLoop;
begin
repeat
Application.ProcessMessages;
Sleep(1);
until FileExists(ChangeFileExt(Application.ExeName,'.end'));
end;
//------------------------------------------------------------------------------
// MAIN
//------------------------------------------------------------------------------
var
test: TTestClass;
begin
try
WriteLn('OraAlerter-Test v1.0');
test:=TTestClass.Create;
test.MainLoop();
finally
FreeAndNil(test);
end;
end.
ODAC Net 5.50.0.15 for Delphi 7
Oracle 9i R2 v9.2.0.1.0
Thanks for your help.
Bye
Andreas