Thema: SQL mitloggen

Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#17

AW: SQL mitloggen

  Alt 24. Okt 2012, 17:22
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;
Andreas
  Mit Zitat antworten Zitat