ASP y SQL

Llevo tres días con el mismo problema y estoy desesperado.
Desde una ASP ejecuto una Stored Procedure la cual me devuelve registros mediante un select.
El resultado lo intento almacenar en un Recordset pero parece que algo no funciona porque no se almacena nada.
El Stored Procedure se ejecuta y lo he único que he conseguido averiguar es que ejecutándolo en un proyecto de VB a modo de prueba, en la inspección del objeto Recordset me indica lo siguiente cuando ejecuto la línea Set rstInforme = objCom.Execute:
<la operación no está permitida si el objeto está cerrado>
No sé qué puedo hacer, cómo abrir el objeto o lo que sea para que el resultado se almacene en el Recordset rstInforme.
Gracias de antemano
Un saludo
Pepotex
Madrid

1 respuesta

Respuesta
1
Por lo que me decís me parece que es un problema de ADO y tiene que ver con la forma de abrir el recordset.
La definición del recordset debería ser
oRs.CursorType = adOpenKeyset
oRs.LockType = adLockBatchOptimistic
Probalo con eso en el caso de que el recordset sea actualizable y si es de solo lectura
oRs.CursorType = adOpenForwardOnly
oRs.LockType = adLockReadOnly
Gracias por tu respuesta pero no se ha solucionado el problema.
Cuando genero el objeto Recordset - rstInforme=CreateObject("ADODB.Rcordset") - las propiedades CursorType y LockType están como tú dices para el caso de solo lectura. He probado la definición que me das en primer lugar para que sea actualizable y en la inspección me sigue poniendo <la operación no está permitida si el objeto está cerrado> en los puntos AbsolutePage, AbsolutePosition, BOF, Bookmark, EditMode, EOF, PageCount, RecordCount y Status, pero no cuando se ejecuta objCom.Execute sino directamente al generar el Recordset, como antes.
¿Habría qué cambiar algo de eso? Porque al ejecutar .Execute no se almacena nada en el recordset. ¿Es posible que los parámetros de la stored sean el problema? Son dos de tipo DateTime y se los paso de la siguiente manera:
objCom.Parameters. Append .CreateParameter("@dtStartDate", adVarChar, adParamInput, 25, "04/04/2003")
El otro es igual. Aunque también lo he intentado de la siguiente manera:
objCom.Parameters. Append .CreateParameter("@dtStartDate", adDBTimeStamp, adParamInput, 10, "04/04/2003")
Nota: cuando ejecuto el stored procedure en el analizador de consultas de la siguiente manera exec StoredProcedure '04/09/2003','04/09/2003', sí me genera el resultado. Si te hace falta que te envíe la stored dímelo.
Muchas gracias por tu atención.
Saludos
Pepe
Madrid
Creo que el problema está en la Stored Procedure. Dentro de la misma ejecuta a su vez dos Stored Procedures que devuelven registros que son almacenados en tablas temporales.
Por último se hace un select distinct de la unión de ambas tablas temp. Y ese es el resultado que deseo almacenar en el Recordset.
Por alguna razón que desconozco, si se ejecutan los Stored no devuelve ningún resultado. Si no ejecuto los Stored y cambio el select distinct por un select a otra tabla ya existente, sí me devuelve resultado.
¿Qué puede estar pasando?
Perdona que sea tan pesado pero es que estoy muy agobiado, ya es el cuarto día con el mismo problema.
Muchas gracias.
Pepe
Madrid
Por lo que me dices no me parece que el problema sean los stored procedures ya que si se ejecutan en el Analizador de Consultas y te muestra el resultado, significa que están correctos y es el conjunto de datos que devuelve. Me inclino a pensar en los parámetros, yo he tenido problemas con variables que involucran fechas pero hace algún tiempo que no desarrollo en VB y la maquina de desarrollo que utilizaba en esa época no la tengo conmigo, de todas formas te recomiendo que verifiques la compatibilidad en cuanto a tipo de datos datetime en sql, cuales serian los posibles equivalentes en vb o las posibles conversiones y por otro lado no me especificas si llevas control de errores en el stored procedure, tal vez te esta devolviendo un error por el tipo de dato en el parámetro, pero no lo estas viendo.
Espero que encuentres pronto la solución y quedo a tu disposición en lo que pueda ayudar.
Si el problema son los parámetros haz la prueba de pasarlos como cadena de caracteres.
No olvides finalizar la pregunta
Los parámetros no son el problema. Los estoy pasando como cadenas de caracteres y el Stored se ejecuta hasta el final generando incluso las tablas temporales que utiliza para almacenar datos intermedios.
Estoy empezando a pensar que la ejecución de un Stored Proc. Que devuelve registros, dentro del Stored Proc. Principal que devuelve el resultado final provoca que el objeto Recordset donde voy a almacenar ese resultado final quede cerrado o bloqueado y no admita el resultado final.
Como solución, al principio se me ocurrió almacenar dicho resultado final en una tabla auxiliar no temporal para posteriormente recuperarlo mediante objCom.Execute("SELECT * FROM TablaAux"). Dicha tabla la borraba previamente en caso de que existiera y la creaba en el propio Stored Proc. Y eso me funcionó perfectamente, pero no me lo han admitido porque dicen que se puede producir un error en caso de que dos usuarios accedan al mismo tiempo y mientras uno intenta recuperar los datos de esa tabla aux. el otro la esté borrando.
Que yo sepa la forma de devolver registros desde un Stored Proc. es mediante la instrucción select ¿No? ¿O hay otra forma?
Si se te ocurre algo, por favor, coméntamelo. Si no, pues se tendrán que conformar con la solución anterior y si no que me despidan.
En cualquier caso, muchísimas gracias por tu dedicación.
Saludos
Pepe
Madrid
Pepe:
Tengo que confesar que es uno de los errores más raros que he visto en stored, de todas formas me parece que lo que has hecho esta bien, esperemos poder solucionar otro problema en otra oportunidad. De todas formas si lo deseas puedes finalizar esta pregunta, aunque más no sea para premiar la buena predispocision.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas