Hallo,
ich habe folgendes Phänomen: Ich habe einen Thread gemacht für den Zugriff auf eine Oracle-Datenbank über
ADO. Dieser Thread bleibt von Zeit zu Zeit (alle paar Tage) einfach stehen (Überwachungfunktion sagt mir, wann der zuletzt etwas getan hat). Keine
Exception, nichts im Eventviewer. Da habe ich Statusfunktionen in die Prozeduren eingebaut und jetzt weiß ich auch, wo der (meistens) stehenbleibt:
in TADOQuery.Active := true.
Die fragliche Routine poste ich mal:
Delphi-Quellcode:
function TOracleAccess.Select(SQLStr: string; var RecCount: integer; var Rec: Variant): boolean ;
var
SQL_Query: TADOQuery ;
Row, Col, ColCount: integer ;
begin
FProzedurName := 'Selectanweisung' ;
FSubStatus := 'gestartet.' ;
result := false ;
EnterCriticalSection(FCritSect) ;
if CheckConnection() then
begin
FSubStatus := 'Schritt 1' ;
SQL_Query := TADOQuery.Create(nil) ;
SQL_Query.CommandTimeout := 20 ;
SQL_Query.Active := false ;
SQL_Query.Connection := FDatabase ;
SQL_Query.SQL.Clear ;
SQL_Query.SQL.Add(SQLStr) ;
try
FSubStatus := 'Schritt 2' ;
FDatabase.BeginTrans() ;
FSubStatus := 'Schritt 3' ;
SQL_Query.Active := true ;
FSubStatus := 'Schritt 4' ;
SQL_Query.Open ;
FSubStatus := 'Schritt 5' ;
SQL_Query.Last ;
FSubStatus := 'Schritt 6' ;
Row := SQL_Query.RecordCount ;
if (Reccount <= 0) or (RecCount > Row) then RecCount := Row ;
if RecCount > 0 then
begin
FSubStatus := 'Schritt 7' ;
ColCount := SQL_Query.FieldCount ;
Rec := VarArrayCreate([0, RecCount, 1, ColCount], varVariant) ;
for Col := 1 to ColCount do
Rec[0,Col] := SQL_Query.Fields[Col-1].FieldName ;
SQL_Query.First ;
Row := 1 ;
while (not SQL_Query.Eof) and (Row <= RecCount) do
begin
for Col := 1 to ColCount do
begin
case SQL_Query.Fields[Col-1].DataType of
ftInteger : Rec[Row, Col] := SQL_Query.Fields[Col-1].AsInteger ;
ftString : Rec[Row, Col] := SQL_Query.Fields[Col-1].AsString ;
ftDateTime: Rec[Row, Col] := SQL_Query.Fields[Col-1].AsDateTime ;
ftBCD : Rec[Row, Col] := SQL_Query.Fields[Col-1].AsInteger ;
ftFloat : Rec[Row, Col] := SQL_Query.Fields[Col-1].AsFloat ;
end ;
end ;
SQL_Query.Next() ;
Inc(Row) ;
end ;
FSubStatus := 'Schritt 8' ;
end ;
FDatabase.CommitTrans ;
result := true ;
FSubStatus := 'Schritt 9' ;
except
Rollback ;
end ;
SQL_Query.Active := false ;
SQL_Query.Free() ;
end ;
LeaveCriticalSection(FCritSect) ;
FSubStatus := 'beendet.' ;
end ;
Ich bekomme den Status "Schritt3" und es geht nicht weiter. Einmal ist er auch in TADOCommand.Execute stehengeblieben, aber Inserts sind in meiner Anwendung halt einfach seltener als Selects.
Hat jemand eine Idee?
Danke und Gruß.