[Más alla de que el hilo sea algo antiguo, me parece importante que en un repositorio de conocimiento como lo es ClubDelphi, se sigan dsicutiendo y desarrollando los temas porque esta misma informacion podria ser consultada en un futuro]
No entiendo porque complicar el diseño de esa manera. Es mucho mas practico y mantenible ser explicito en lo que necesitas y no "andar buscando y revolviendo" para encontrarlo. Ademas, estas creando el query dentro del procedimiento, actuando sobre un parametro pasado por valor (y no por referencia o salida) por lo que el invocador no obtiene la referencia a dicho query. El
FreeAndNil no te arroja un
EAccessViolation simplemente de casualidad porque la variable del query primero la setea a
nil, y es seguro llamar al metodo
Free sobre una referencia que es
nil
Esto es un poco mejor:
Código Delphi
[-]
uses
Data.Win.ADODB;
function Query(const Connection: TADOConnection; const SqlQuery: string): TADOQuery;
function SingletonQuery(const Connection: TADOConnection; const SqlQuery: string): TADOQuery;
implementation
var
FSingletonQuery: TADOQuery = nil;
function Query(const Connection: TADOConnection; const SqlQuery: string): TADOQuery;
begin
Result := TADOQuery.Create(nil);
Result.Connection := Connection;
Result.SQL.Text := SqlQuery;
Result.Open;
end;
function SingletonQuery(const Connection: TADOConnection; const SqlQuery: string): TADOQuery;
begin
if not System.Assigned(FSingletonQuery) then
FSingletonQuery := TADOQuery.Create(Connection);
FSingletonQuery.Close;
FSingletonQuery.SQL.Text := SqlQuery;
FSingletonQuery.Open;
Result := FSingletonQuery;
end;
No me gusta tanto la alternativa del "Singleton" y prefiero crear querys para cada consulta que requiero hacer. Ya que por ejemplo si necesito cargar dos grids, la funcion original del post o la "SingletonQuery" no me sirve de nada