Monitoringtabellen von FireBird benutzen?
In MON$STATEMENTS stehen die laufenden
SQL-Statements, in MON$ATTACHMENTS stehen die offenen Verbindungen.
Mit
DELETE FROM MON$STATEMENTS WHERE MON$ATTACHMENT_ID = :ATTACHMENT_ID
beendest Du ein laufendes Statement, mit
DELETE FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = :ATTACHMENT_ID
beendest Du eine aktive Datenbankverbindung (jeweils ohne Rücksicht auf Verluste, ohne Nachfrage, ...)
Sinngemäß ungetestet hingedaddelt:
Delphi-Quellcode:
// Statement für das Löschen einer bestimmten Verbingung erstellen
qryExec.SQL.Text := '
DELETE FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = :ATTACHMENT_ID; commit;';
// Alle Attachment_IDs zu offenen Verbindungen ermitteln,
// sofern Du dich als letzter User an der DB angemeldet hast,
// wird Deine eigene Verbindung zuletzt beendet.
// Oder halt die eigene ATTACHMENT_ID vorher ermitteln und per Where-Bedingung ausklammern.
qry.SQL.Text := '
select MON$ATTACHMENT_ID as ATTACHMENT_ID from MON$ATTACHMENTS order by MON$ATTACHMENT_ID';
qry.Open;
while not qry.EoF
do begin
qryExec.SQL.ParamByName('
ATTACHMENT_ID').AsInteger := qry.FieldByName('
ATTACHMENT_ID').AsInteger;
qryExec.ExecSQL;
qry.Next;
end;
qry.Close;
Damit sollten dann alle Datenbankverbindungen weg sein, einschließlich Deiner eigenen Verbindung.
Eventuell geht es ja auch mit
Delphi-Quellcode:
qryExec.SQL.Add('execute block as');
qryExec.SQL.Add('begin');
qryExec.SQL.Add(' DELETE FROM MON$ATTACHMENTS;');
qryExec.SQL.Add(' commit;');
qryExec.SQL.Add('end');
qryExec.SQL.ExecSQL;
Da damit dann auch die eigene Verbindung weg ist, könnte ein Try-Execpt drumrum nicht schaden
Und: Diese Lösung ist (wenn sie so funktioniert) garantiert äußerst grenzwertig