Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-04-2017
Avatar de Draker
Draker Draker is offline
Miembro
 
Registrado: ene 2005
Posts: 27
Poder: 0
Draker Va por buen camino
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?
Responder Con Cita
  #2  
Antiguo 17-08-2017
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 121
Poder: 17
APO Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 17-08-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 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
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema al crear DSN en tiempo de ejecución, pero sólo al ejecutar, no desde Delphi aquiestamos Conexión con bases de datos 1 08-07-2013 11:20:12
Problema con borrado de componentes creados en tiempo de ejecución harpo OOP 5 22-12-2007 17:54:55
Problema con DBGRiD y campos en Tiempo de ejecución EITB OOP 0 14-10-2004 18:59:17
Problema con un Timer en tiempo de Ejecucion santiellupin OOP 4 15-05-2004 17:21:37
Usar datos originados por TADOQuery Draco Conexión con bases de datos 4 30-04-2004 07:35:56


La franja horaria es GMT +2. Ahora son las 19:33:06.


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
Copyright 1996-2007 Club Delphi