Hallo himitzu,
das mit dem Result als TFDQuery schein nicht zu funktionieren. Der Compiler
meckert, "Symbol Result kann nicht erfasst werden" innerhalb der anonymen Thread Methode.
Delphi-Quellcode:
function TdmDALZMI.GetBau(BauNr: integer): TDataSet;
var
oConn: TFDConnection;
// oQuery: TFDQuery;
begin
// oQuery := nil;
Result := TFDQuery.Create(nil);
oConn := TFDConnection.Create(nil);
// oQuery := TFDQuery.Create(nil);
try
TThread.Synchronize(nil, procedure
begin
oConn.ConnectionDefName := ZMIConnectionDefName;
Result.Connection := oConn; //<<<geht nicht
Result.FetchOptions.AutoFetchAll := afAll;
Result.SQL.Text := 'SELECT * FROM BAU WHERE BAUNR = :BAUNR';
Result.Params[0].AsInteger := BauNr;
Result.Open;
// oConn.Close;
end);
// result := oQuery;
except
result.Free;
// oConn.Free;
end;
end;
Wegen dem Connection Objekt, als ich umgestellt habe, bin ich nach dem Beispiel Pooling von FireDAC
vorgegangen. Hier wird eine Connection instanziiert allerdings auch wieder freigeben!
Mit nicht freigeben von Objekten bin ich nicht Sattelfest. Ich kann das noch nicht greifen.
Aber wenn es funktioniert, ist mir das auch recht.
Eigentlich hätte ich erwartet dass das Connection Objekt über den ConnectionManager gemanagt wird.
Delphi-Quellcode:
procedure TConnectThread.Execute;
var
oConn: TFDConnection;
oQuery: TFDQuery;
i: Integer;
begin
oConn := TFDConnection.Create(nil);
oQuery := TFDQuery.Create(nil);
try
oQuery.Connection := oConn;
oConn.ConnectionDefName := FForm.cbDB.Text;
for i := 1 to 50 do begin
oQuery.SQL.Text := 'select count(*) from {id Region}';
oQuery.Open;
oConn.Close;
Synchronize(FForm.Executed);
end;
finally
oConn.Free;
oQuery.Free;
end;
end;
Leider kann ich nicht nachvollziehen wie du es gemeint hast mit
Query als Owner.
Wenn es deine Zeit erlaubt, würdest du das bitte kurz beschreiben.
Gruß Kostas