PDA

Ver la Versión Completa : Poner TADOQuery a null


fausto
10-11-2006, 12:58:55
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.


ADOQ.Connection.Close; (Connected := False;)
ADOQ.Connection.Close;

fausto
13-11-2006, 18:59:53
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:
ADOQuery1.Active:= True;
Cuando ya no necesitas que este conectado:
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 (http://neftali.clubdelphi.com/images/ResaltarSintaxisDelphi.png).

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.