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 Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2007
fonx fonx is offline
Miembro
 
Registrado: feb 2007
Posts: 54
Poder: 18
fonx Va por buen camino
Problemas al cerrar-destruir Tquery, o al hacer segunda consulta

Hola, este es mi caso (Delphi5 con access):

Bucle:
Selecciono datos
Proceso datos
Fin Bucle

La primera vez lo hace bien:

Código:
query.active:=false;
 query.SQL.text:=('SELECT * FROM Datos WHERE Historico=No');
query.active:=true;
If query.RecordCount>0 then 
   Procesar Datos
Pero las sucesivas no funciona porque no puedo hacer query.active:= false, me casca ahi. Me dice que se ha llegado a la marca de EOF y que para hacer esa operación necesita al menos un registro. Si la primera consulta no devuelve datos entonces el query esta obligatoriamente en EOF.

La solución temporal que he adoptado es que el query sea una variable local a la función de modo que cuando se llega al final de la funcion destruyo el query
Código:
query.Destroy;
pero me casca en el destroy porque me dice que "cannot perform this operation on an open dataset", y como no puedo cerrarlo pues no se si se destruye. Al entrar de nuevo en la funcion la variable query es otra nueva, pero las reservas de memoria anteriores en otras pasadas por esta funcion no se si se liberan o no.

¿Ideas? ¿Soluciones?
Responder Con Cita
  #2  
Antiguo 27-09-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Puedes intentar con este código:

Código Delphi [-]
var
  AQuery: TQuery;

begin
  with TQuery.Create(nil) do
    try
      // Asignas valores a propiedades como Database, etc...
      SQL.Text := 'select * from Datos where Historico = No';
      Open;
      If not IsEmpty then
        // Procesar datos
      Close
    finally
      Free
    end
end;

De esta forma dentro de la función creas, usas y destruyes el objeto...

Ahora, si te fijas, usé el método Free para destruir el objeto, no Destroy...



Saludos...
Responder Con Cita
  #3  
Antiguo 27-09-2007
fonx fonx is offline
Miembro
 
Registrado: feb 2007
Posts: 54
Poder: 18
fonx Va por buen camino
No funciona, casca al hacer el close y no libera memoria. Este es el mensaje:

Project xxx.exe raised exception class EOleException with message 'El valor de BOF o EOF es True, o el actual registro se eliminó: la operación solicitada requiere un registro actual'


Código:
while true do
  begin
    Prueba();
  end;
Código:
Procedure Prueba();
Var
   difAnt:real;
   i:integer;
   error:boolean;
   query:TADOQuery;
begin
   Try
   query :=TADOQuery.create(nil);
   query.Connection:=AC1;
   query.SQL.text:=('SELECT * FROM Datos WHERE Historico=No');
   query.Open();
   For i:=1 to query.recordcount do
   begin
      query.next;
   end;
   query.close;
   query.Free;
   Except
      error:=true;
   end;

end;
También probé esta forma:
Código:
Procedure Prueba2();
Var
   difAnt:real;
   i:integer;
   error:boolean;
   query:TADOQuery;
begin
   Try
   query :=TADOQuery.create(nil);
   query.Connection:=AC1;
   query.SQL.text:=('SELECT * FROM Datos WHERE Historico=No');
   query.active:=true;
   For i:=1 to query.recordcount do
   begin
      query.next;
   end;
   query.Destroy;
   Except
      error:=true;
   end;

end;
No libera memoria, ese bucle infinito no para de coger memoria...Casca al hacer el close() o el destroy(). Esto pasa cuando:
  • el query no tiene registros, entonces EOF = true.
  • el query esta posicionado en el ultimo registro, entonces EOF = true.
Si hay registros lo tengo facil porque solo tengo q hacer query.First y ya me lo libera, pero si no hay registros el query no se libera y me queda esa memoria sin liberar...¿Será un bug del Delphi5?
Responder Con Cita
  #4  
Antiguo 27-09-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Para que siempre te libere el objeto TADOQuery, usa la construcción try..finally, ya que esta siempre ejecuta la parte del finally haya o no haya excepción...

Y te repito de nuevo, no uses el método Destroy para liberar objetos, ese método es de uso interno de Delphi, usa el método Free...

Sobre tu código de prueba, si haces un while True do, lo único que vas a lograr es un loop infinito, ya que True siempre va a ser True...

Puedes probar lo siguiente:

Código Delphi [-]
if Prueba then
  ShowMessage('Prueba exitosa');


// Código de Prueba
function Prueba: Boolean;
var
   difAnt: Double;
   I: Integer;

begin
  Result := True;
  with TADOQuery.Create(nil) do
    try
      try
        Connection := AC1;
        SQL.Text:= 'SELECT * FROM Datos WHERE Historico=No';
        Open;
        First;
        while not Eof do
          Next;
        Close
      except
        ShowMessage('Ocurrió un error');
        Result := False
      end
    finally
      Free
    end
end;

Sobre TADOQuery, la verdad no sabría decirte si tiene algún tipo de error o limitante en Delphi 5, sería investigar un poco al respecto...



Saludos...
Responder Con Cita
  #5  
Antiguo 27-09-2007
Avatar de Victor Vega
Victor Vega Victor Vega is offline
Miembro
 
Registrado: feb 2005
Posts: 12
Poder: 0
Victor Vega Va por buen camino
Hola...

veo q estas usando un bucle...
probaste usar :

Código Delphi [-]
 
if not EOF
Responder Con Cita
  #6  
Antiguo 27-09-2007
fonx fonx is offline
Miembro
 
Registrado: feb 2007
Posts: 54
Poder: 18
fonx Va por buen camino
El while true lo puse yo para que se ejecutara infinitas veces y así ver si no liberaba la memoria, y efectivamente la memoria ocupada crece y crece y crece...

No funciona el close si el query tiene EOF = true, salta una excepcion. Ahora voy a reiniciar el ordenador pq con tanta prueba ya ni funciona...
Responder Con Cita
  #7  
Antiguo 27-09-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Por experiencia, cuando algo no sale, miramos las cosas más absurdas y nos emperramos en que hay un virus en el ordenador que no lo deja funcionar bien.

Ese momento es el idóneo para dejar el puñetero ordenador y hacer otra cosa que no tenga nada que ver con el trabajo ni con ordenador.

El fallo es la propia consulta sql, ya que debe decir: where Historico = 'No' (¿ves las comillas simples? pues faltan en tu sql).

Código Delphi [-]
Procedure Prueba();
Var
   difAnt:real;
   i:integer;
   error:boolean;
begin
  // query es un componente puesto en la ventana
   query.SQL.text:=('SELECT * FROM Datos WHERE Historico=' + QuotedStr(No));
   query.Open();
   while not query1.Eof do
      query.next;

   query.close;
end;

Una observación: Yo he usado QuotedStr que añade comillas simples alrededor de la palabra. Pero no sé lo que espera Access (o ADO), puede que espere comillas dobles... la que está encima del número 2.

Saludos y descansa un poco amigo fonx, te lo mereces.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



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
[Pregunta] Cerrar o destruir ventana Kpoch API de Windows 2 27-04-2007 19:26:48
problemas al actualizar por segunda vez @-Soft Tablas planas 2 07-09-2006 19:53:22
Sincronizar DBLookupComboBox con Tquery al hacer locate en la tabla ronalg Conexión con bases de datos 1 27-05-2006 15:58:06
consulta en sus propiedades de Tquery jorgito Conexión con bases de datos 9 31-01-2006 15:57:35
consulta en sus propiedades de Tquery jorgito Conexión con bases de datos 1 20-01-2006 23:06:32


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


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