Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Object Was Open (https://www.clubdelphi.com/foros/showthread.php?t=94015)

gaunmanuel 19-06-2019 22:33:26

Object Was Open
 
Que tal comunidad.
Tengo un detalle con una consulta, la cual al ejecutarla me marca: Object Was Open
Características de la aplicación:
  • Delphi 7
  • TADOQuery
  • SQL Server 2012
  • El resultado son mas de 400,000 registros y como 50 columnas(Sé que este es el problema el error es normal con está cantidad de información)
ahora bien, buscando en la red, encontré que para solucionar estableces:
Código Delphi [-]
qry.CursorLocation := clUseServer;
qry.CursorType: ctOpenForwardOnly;
Es correcto, con esto funciona el query, sin embargo el problema ahora esta al momento de desplegar la información en un DBGrid, no se puede desplegar ya que los DBGrid usando bookmarks :(

Pues bien, seguí investigando para ver si lo graba algo y cual fue mi sorpresa...
Pero me resulto algo que fue lo que hizo que escribiera a este foro:
  • Hice otra aplicación X en delphi, para estar probando...
  • y cual fue mi sorpresa, que en esta aplicación X el mismo query funciona bien!!.

Sin embargo, en mi aplicación principal, es decir en el sistema que desarrollamos, ahí no funciona, aquí sigue marcando Object was Open.
Si a alguien le paso algo similiar, le agredecería sus comentarios y/o ayuda, porque en una simple aplicacion de una forma funciona bien, pero en la otra aplicación grande ya no funciona?

Codigo Delphi:
Código Delphi [-]
query.Connection := ADOConnection;
query.Active := true;
//ambos sistemas tiene exactamente la misma ejecución
gracias.
saludos.

Casimiro Notevi 19-06-2019 23:28:11

Eliminas el query y vuelves a ponerlo, se han oido cosas de esas algunas veces :)

gaunmanuel 20-06-2019 00:38:50

No funciono :(
hice la prueba creando un query nuevo, pero no.
De hecho este query se crea en runtime, por lo tanto siempre es nuevo.

Neftali [Germán.Estévez] 20-06-2019 13:12:18

Prueba con las sigientes propiedades:
  • CursorLocation: clUseServer
  • CursorType: ctOpenForwardOnly
  • EnableBCD: False
  • LockType: ltReadOnly
Tener una consulta con más de 400.000 registros y un CursorLocation que no sea "server" no se si tiene mucho sentido.
Al igual que lanzar una consulta con esos resultados para mostrarlos en un Grid.

gaunmanuel 20-06-2019 17:05:06

Que tal Neftali.
Si eso ya lo probé, y si funciona...
y como tu dices, no tiene sentido tener la consulta con un CursorLocation que no sea server, si es correcto!!
Aquí la cuestión era, porque en una aplicación simple que hice de prueba para verificar el query si funcionaba y en el sistema ya real no funcionaba, marcaba el :Object Was Open.

Sin embargo, creo que ya logre saber porque en una si funciona y en otra no...
Todo parece indicar que es por que la aplicación principal tiene otros queries abiertos en base a lo que necesita, por lo tanto al ejecutar este query tan grande ya no lo soporta...
En cambio la aplicación simple de prueba que hice, pues no tiene carga de nada, solo el query grande y este si lo ejecuta, sin embargo si lo ejecuto una segunda vez sin haber cerrado la aplicación, ahora si marca el error de: Object Was Open, no se si me explique?
Es decir, como que la conexión solo tiene capacidad de al menos ejecutar una vez el query pero una segunda ya no... quizá el asunto este en liberar la conexión o la memoria, pero esto no se como hacerlo, si tienes alguna idea, te lo agradecería...

gracias.
saludos.

orodriguezca 20-06-2019 17:11:35

Codigo Delphi:
Código Delphi [-]
query.Connection := ADOConnection;
query.Active := true;
//ambos sistemas tiene exactamente la misma ejecución

¿Y la aplicación "X" también está conectada a un DBGRID?, ¿ y también tiene clUseServer y ctOpenForwardOnly?. Por lo general cuando se abre un cursor mantenido por el servidor (clUseServer) y de solo lectura hacia adelante (ctOpenForwardOnly) es porque se quiere hacer un procesamiento masivo de datos, quizás generar un reporte o algo similar, no para mostrarlo en un Grid, ya que el Grid requiere que el cursor pueda moverse en ambos sentidos.

Por otro lado: ¿Es realmente necesario mostrar esos 400,000 registros en un grid?

Neftali [Germán.Estévez] 21-06-2019 12:20:19

Cita:

Empezado por gaunmanuel (Mensaje 532482)
...sin embargo si lo ejecuto una segunda vez sin haber cerrado la aplicación, ahora si marca el error de: Object Was Open, no se si me explique?
Es decir, como que la conexión solo tiene capacidad de al menos ejecutar una vez el query pero una segunda ya no... quizá el asunto este en liberar la conexión o la memoria, pero esto no se como hacerlo, si tienes alguna idea, te lo agradecería...

Yo creo que los problemas vienen por lo que comentas al final. Es un tema de recursos o capacidad a la hora de gestionar Datasets muy grandes.
El error interno que se genera en ADO es DB_E_OBJECTOPEN, y está asociado a operaciones o consultas con gran cantidad de datos.
A partir de ese momento, obtienes en ADO el error que comentas.


La franja horaria es GMT +2. Ahora son las 21:20:08.

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