Also man kann sich auch in die Events der ADOConnection einklinken und so Queries mitprotokollieren.
Bei folgendem Code-Schnipsel habe ich einige Dinge ausgeschnitten (betreffend Zeitmessung),
aber das Prinzip müsste klar sein.
Delphi-Quellcode:
procedure TMainDataModule.ConnectionExecuteComplete(Connection: TADOConnection;
RecordsAffected: Integer;
const Error: ADODB.Error;
var EventStatus: TEventStatus;
const Command: _Command;
const Recordset: _Recordset);
{ Komplett auskommentiert, da ab und an Fehler auftreten (Command.Parameters.Item[i] ist nil, wiesoauchimmer).
Ist eh nur für Zeitmessungen interessant, wenn man die Parameter der Query wissen will.
function GetMoreInfo: string;
var
i: Integer;
begin
Result := 'RecordsAffected: ' + IntToStr(RecordsAffected);
try
if Command.Parameters.Count > 0 then
begin
Result := Result + ', ' + IntToStr(Command.Parameters.Count) + ' Parameter: ';
for i := 0 to Command.Parameters.Count-1 do
begin
if i > 0 then
Result := Result + ', ';
Result := Result + '"' + Command.Parameters.Item[i].Name + '" = "' + VarToStr(Command.Parameters.Item[i].Value) + '"';
end;
end;
except
end;
end;
}
var
sql:
string;
//time: Integer;
ms: Double;
begin
// time := GetTickcount-FSQLExecTime;
sql := CleanupSQL(Command.CommandText);
// Alle Whitespaces durch ein einzelnes Leerzeichen ersetzen.
// und mehrfache Leerzeichen auf eines reduzieren
sql := StrRemoveSequentialChars(StrReplaceChars(
sql,[#13,#10,#9],'
'),['
']);
FTimeLogger.WriteLogFileFmt('
SQL %7.1f ms: %s', [ms,
sql]);
//FTimeLogger.WriteLogFile(' ' + GetMoreInfo);
end;
function CleanupSQL(
const sql:
string):
string;
var
i: Integer;
begin
// Teilweise werden von den Command-Objekten SQL-Strings zurückgegeben, die
// mittendrin ein #0 Zeichen haben => Dort abschneiden.
i := CharPos(
sql,#0,1);
if i > 1
then
Result := Copy(
sql,1,i-1)
else
Result :=
sql;
end;