PDA

Ver la Versión Completa : Object Was Open


gaunmanuel
19-06-2019, 22:33:26
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:

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:

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: ltReadOnlyTener 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:

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
...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 (https://social.msdn.microsoft.com/Forums/sqlserver/en-US/b8542271-c47f-4a28-9d3b-1d32b8f393b4/ado-object-was-open-error-aka-dbeobjectopen-on-large-dataset-in-ms-sql-2012?forum=sqldataaccess).
A partir de ese momento, obtienes en ADO el error que comentas.