Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problema al usar TADOQuery en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=91736)

Draker 10-04-2017 20:30:03

Problema al usar TADOQuery en tiempo de ejecución
 
Buenas tardes tengo una unidad con lo siguiente:
Código Delphi [-]
Procedure Ta.qEx(Tq1:TADOQuery;Q:String;T:Integer);

Var F: TForm;
Begin
  if Not (Assigned(Tq1)) Then
  begin
    F:= TForm( Application.FindComponent(Owner.Name) );
    Tq1            := TADOQuery.Create(Nil);
    Tq1.Connection := TADOConnection(F.FindComponent('Cnn'));
  end;

  if Tq1.Active
  then
    Tq1.Close;
  Tq1.SQL.Clear;
  Tq1.SQL.Add(Q);
  If T=1
  Then Tq1.Open
  Else
    Begin
      Tq1.ExecSQL;
      Tq1.Close;
    End;
End;
Y la mando a llamar desde mi form asi:
Código Delphi [-]
Tq := TADOQuery.Create(Nil);

  Tq.Connection:= Cnn;

  qSql:='Select * From ctFacturaIVA';
  fA.qEjecuta(Tq,qSQL,1);
  ........
  ........
  FreeAndNil(Tq);
Hasta ahi funciona bien, el problema es si quiero mandar a:

Código Delphi [-]
  
  qSql:='Select * From ctFacturaIVA';
  fA.qEjecuta(Tq,qSQL,1);

sin un create previo, ahora, cae en que no esta Assigned, por lo que lo crea, pero me marca error al tratar de obtener datos de ese ADOQuery, ya lo intente con Nil, Application,Owner, self, Tq1 y nailas.....
alguna ayudita?

APO 17-08-2017 12:25:00

En vez de utilizar Assigned, puedes compararlo con la propiedad connection. De manera que tendrías que sustituir la línea:

Código Delphi [-]
 if Not (Assigned(Tq1)) Then

por lo siguiente:

Código Delphi [-]
if Tq1.Connection=nil then

Yo lo he probado así y funciona correctamente.

AgustinOrtu 17-08-2017 20:04:03

[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


La franja horaria es GMT +2. Ahora son las 20:04:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi