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)
-   -   Poner TADOQuery a null (https://www.clubdelphi.com/foros/showthread.php?t=37359)

fausto 10-11-2006 12:58:55

Poner TADOQuery a null
 
Hola a todos.

Os explico mi problema:

Tengo un objeto TADOQuery el cual abro y utilizo.
Lo último que hago con él es cerralo (con "Close").
(La BBDD a la que accede es SQL Server)

Pero me he dado cuenta de que el método "Close" no elimina la conexión de la BBDD. Se queda en estado "Awaiting command".
He probado con "Destroy", pero tampoco...

He oído que la forma de hacerlo es poner el objeto a null.

No sé si esa el la forma correcta de hacerlo o no.
¿Podríais ayudarme?

Que conste que llevo muuuy poco tiempo en esto de Delphi...

Saludos y gracias anticipadas.

Neftali [Germán.Estévez] 10-11-2006 13:22:03

Intentar cerrar/liberar la conexión asociada a ese ADOQuery si es que no la utilizas en otro sitio.

Código Delphi [-]
  ADOQ.Connection.Close;  (Connected := False;)
  ADOQ.Connection.Close;

fausto 13-11-2006 18:59:53

Poner TADOQuery a null
 
Gracias por la solución, pero tp me vale.

Explico con más detalle la situación:

Tengo un objeto TADOQuery que pertenece a un Form y que utilizo más de una vez.
He conseguido eliminar la conexión a la BBDD liberando el objeto:

miTADOQuery.Free:

El problema es que, cuando lo utilizo la segunda vez, por supuesto no me deja.

Al liberar el objeto tendría (creo) que volver a darle todos los valores que le dí al crear el objeto de forma visual (arrastrándolo, etc...) y es un coñazo.

No me deja cerrar (con "Close") la conexión pq en todo momento me dice que es nil. (Los datos de la conexión los sabe a través de la propiedad ConnectionString).

Los demás objetos que tenía en la misma situación no me han dado problemas pq se crean en el mismo método en que los utilizo. Los libero con "Free" y se vuelven a crear de cero cuandio llamo al método.

Supongo que me he explicado fatal... pero, aún así:
¿Alguna idea?

Caral 13-11-2006 19:07:37

Hola fausto
Creo que Neftali te esta dando la solucion.
Cuando se activa, ose necesitas la informacion del query:
Código Delphi [-]
ADOQuery1.Active:= True;
Cuando ya no necesitas que este conectado:
Código Delphi [-]
ADOQuery1.Active:= False;
Esto conecta y desconecta el query.
Ahora no se porque desconectarlo del connectionString, Para Que :confused:
Si dices que lo utilizas denuevo varias veces., No lo entiendo.:confused: :confused:
Saludos

fausto 13-11-2006 19:29:38

Poniendo "Active" a False, la connexión se sigue quedando (aunque "sleeping") en la BBDD.
Ejecuto el procedimiento sp_who de SQL Server que me da las conexiones que tiene en el momento, y sigue esándo. Sólamente desaparece cuando libero el objeto TADOQuery.
Tanto con "close" como poniendo "Active" a false, deja la conexxion "sleeping", pero no la libera realmente.
Respecto a la desconectarlo del ConnectionString... no me explicado bien. Ni caso.

poliburro 13-11-2006 20:37:59

Efectivamente mi amigo, a pesar de lo que dicen los dos amigos foristas anteriores, no basta con cerrar la consulta o desactivarla para liberar la conexión en SqlServer.

Esto deberás hacerlo directamente sobre tu objeto AdoConnection.

Deberas hacer lo siguiente amigo mio.

AdoConnection.Close;
AdoConnection.Free;
AdoConnection := Nil;

Si tienes los componentes en un Datamodule es más sencillo

Datamodule.AdoConnection.Close;
DataModule.Free;
DataModule := Nil;


Suerte amigo.

fausto 14-11-2006 09:11:15

Hola de nuevo.

Lo de cerrar la conexión explícitamente es lo primero que probé, pero cuando hago el "Close" me da error ya que el objeto "Connection" es siempre nil. Si paso del "Close" y hago el "Free" (que no casca si el objeto ya es nil) pasa de mi y no libera la conexión. Sólo he conseguido que la libere con el "Free" del propio objeto TADOQuery (cosa que no me vale).

[code]
miTADOQuery.Connection.Close; //aquí me da el error
miTADOQuery.Connection.Free;
miTADOQuery.Connection := nil;
[code]

El objeto TADOQuery lo declaro en la cabecera de la unidad "unit":

[code]
type
miTADOQuery: TADOQuery;
[code]

En el método "FormCreate" le pongo la conexión:

[code]
miTADOQuery.ConnectionString := CadenadeConexion; //CadenadeConexion tiene valor correcto seguro
[code]

en mi método X lo utilizo:

[code]
miTADOQuery.Parameters.ParamByName('nombreP¡_parametro').Value := 0;
miTADOQuery.Open;
miTADOQuery.First;
//lo recorro
While not miTADOQuery.Eof do
//...
end;
[code]

Y al final:

[code]
miTADOQuery.Connection.Close; //esto siempre es nil!!!!
miTADOQuery.Connection.Free;
miTADOQuery.Connection := nil;
[code]

Llevo poco tiempo en esto de Delphi, pero esto me está volviendo loco.
¿Que estoy haciendo mal?
(Perdón si no he utilizado las etiquetas para código delphi bien...)

Neftali [Germán.Estévez] 14-11-2006 11:10:12

Se agradece el intento de utilizar TAGS, aunque no lo has hecho corretamente; Revisa este link.

fausto 14-11-2006 11:42:59

Ok. Gracias por la indicación de los tags.

Y, por fin, creo haber solucionado ya el problema.
Al fin y al cabo era lo que todos me habéis ido contestando pero, dado mi poco conocimiento de Delphi, no lo he pillado.

He creado un objeto TADOConnection y se lo he asignado a mi TADOQuery. de esta forma si funciona cerrando y liberando la conexión sin necesidad de liberar el objeto TADOQuery.

Gracias a todos, perdón por las molestias y hasta la próxima.


La franja horaria es GMT +2. Ahora son las 03:48:13.

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