Ver Mensaje Individual
  #3  
Antiguo 17-08-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
[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;

// Crea un TADOQuery ejecuta la sentencia SQL indicada
function Query(const Connection: TADOConnection; const SqlQuery: string): TADOQuery;

// Esto sigue mas la filosofia del codigo original, que pretende crear una unica vez el TADOQuery
// y reutilizar siempre el mismo para las distintas consultas 
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
Responder Con Cita