ich führe bei einem TSQLQuery ein Select aus. Die Datenbank ist sehr groß. Nun möchte ich dem Benutzer meiner Software ein Abbruch-Button zur verfügung stellen. Jedoch bleibt das Programm bei dem Aufruf von SQLQuery.Close scheinbar hängen. Wenn ich im Select aber eine TOP xxx mitgebe läuft er durch das close durch. Ich vermute mal, das da noch irgendwas gemacht wird, worauf das close wartet.
Da der Zugriff im jeden Fall nur lesend ist, sollte doch eigentlich kein Rollback nötig sein. Was macht TSQLQuery bei close, was da so lange dauert? Wie kann ich einen sofortigen Abbruch eines Selects realisieren?
Code: Alles auswählen
procedure TForm_Execute.ProgressSQlRequest();
var i, Row, Col : Integer;
FieldName, Value : String;
begin
Log.PostInfo('Execute SQL-Request...');
with Form_Main do begin
try
SQLQuery.Open();
while (not SQLQuery.EOF) and (not doCancel) do begin
for i := 0 to SQLQuery.Fields.Count - 1 do begin
//...
end;
Application.ProcessMessages();
SQLQuery.Next();
end;
if doCancel then begin
Log.PostInfo('Cancel SQL-Request...');
end;
Log.PostInfo('Close SQL-Request...');
SQLQuery.Close();
Log.PostInfo('SQLQuery Closed...');
except
on E:Exception do begin
Log.PostError('Execute: ' + E.ToString);
Exit();
end;
end;
end;
Log.PostInfo('Done.');
end; {ProgressSQlRequest}
Das SQL-Statement wird vor aufruf der obigen Methode mittes "SQLQuery.SQL.Text := SQLStatement;" gesetzt.
LG
Thandor