¡Hola!
A raíz de este mensaje me entero que existe, al menos en Firebird e InterBase, una sentencia SQL llamada
Declare Cursor (me pregunto si tendrá que ver con las recientemente mencionadas
tablas temporales).
Según se desprende del mensaje de error, es como si se estuviera ejecutando dos veces un mismo
Declare Cursor sin un
Close entre uno y otro:
Código SQL
[-]
Declare MiCursor Cursor For Select...
...
Close MiCursor -- (como si esta sentencia SQL no fuese ejecutada)
...
Declare MiCursor Cursor For Select...
Algo que puedes hacer es buscar ese tipo de sentencias SQL en los fuentes de MDO, y seguirles la pista con el depurador. A ver cuándo se lanza el
Declare y cuando se lanza el
Close. No conozco los MDO, pero, considerando que son relativamente populares, quizá hagas algo mal desde tu programa, omitiéndose alguno de esos cierres de cursor.
Claro, esto mismo puede estar ocurriendo dentro de los disparadores y procedimientos almacenados, si es que dentro de ellos hay sentencias para creación, manejo y cierre de cursores.
En conclusión, es probable que se esté omitiendo uno de esos
Close por algún descuido en el código de tu programa o en el código de los disparadores y SPs. La razón por la que esto ocurre tan azarosamente puede residir en alguna condición que, por no cumplirse, impida entrar al bloque de código o llamar a la rutina donde se ejecuta el cierre, o por algún error (excepción) previo no bien manejado que interrumpa la ejecución normal del programa.
Espero logres solucionarlo, apóyate en el depurador de oro de Delphi y échale un vistazo a las rutinas internas de la base de datos.
No dejes de comentarnos.
Al González.