Page 1 of 1
					
				EStackOverflow in TMSSQLMonitor
				Posted: Thu  15 Sep 2016 15:59
				by Eden0928
				I want write monitor log when exec SQL in TMSSQLMonitor. My code below:
Code: Select all
procedure TDM.MSSQLMonitor1SQL(Sender: TObject; Text: string;
  Flag: TDATraceFlag);
begin
  MSQuery1.SQL.Text := 'INSERT INTO LOG_TABLE(MSG) VALUES(Text)';
  MSQuery1.ExecSQL;
end;
But, I get the EStackOverflow: Stack overflow.
I don't know why?
 
			
					
				Re: EStackOverflow in TMSSQLMonitor
				Posted: Fri  16 Sep 2016 10:02
				by azyk
				The 'Stack overflow' error occurs due to a recursive call of the OnSQL event. This is because the ExecSQL method is called in the event handler, that leads to repeated call of the event and looping as a result. To avoid this error, you shouldn't call ExecSQL in the OnSQL event.
			 
			
					
				Re: EStackOverflow in TMSSQLMonitor
				Posted: Fri  16 Sep 2016 10:33
				by Eden0928
				I need write log in my database.
Should I how to?
Thanks your reply!
			 
			
					
				Re: EStackOverflow in TMSSQLMonitor
				Posted: Wed  21 Sep 2016 12:41
				by azyk
				Try to declare a global variable, whose value would allow to detect the SQL query, that called the OnSQL event: the application query or the logging query. For example:
Code: Select all
var
  InLogging: boolean = False;
implementation
{$R *.dfm}
...
procedure TMainForm.MSSQLMonitor1SQL(Sender: TObject; Text: string;
  Flag: TDATraceFlag);
begin
  if not InLogging then begin
    InLogging := True;
    try
      MSQuery2.SQL.Text := ...;
      MSQuery2.ExecSQL;
    finally
      InLogging := False;
    end;
  end;
end;