martes, 27 de agosto de 2013

ADODB.Recordset está cerrado después de llamar a un sp

La chorrada de hoy me ha llevado, más de 3horas.

Situación:
- Un procedimiento que funciona en el SQL Server Management, con parámetros de entrada y recordset de salida. El SP hacia un insert y retornaba un recordset (hacia más cosas, esto es para resumir :P)
- Código Vb6, cuando ejecutaba el código y quería ver el contenido del recordset, el VB6 me daba un error de “La operación no está permitida si el objeto está cerrado.”
- El SP se había ejecutado porque tenía un registro más.

Di por supuesto que el problema estaba en como hacia la llamada al SP desde Vb6 (el SP funcionaba bien, se había ejecutado). Después de hacer un poco de I (sin +D porque desarrollo cero) pregunte a expertos en VB6 mayores que yo y nada.

La solución fue:
Añadiren el SP SET NOCOUNT ON al comienzo del código y SET NOCOUNT OFF justo antes de devolver los resultados finales

Si el procedimiento envía varios mensajes al cliente, el resulset no los procesa adecuadamente y suele dar ese mensaje de error.

La solución gracias a:
http://microsoft.public.es.sqlserver.narkive.com/fNVcXJuO/modo-correcto-de-ejecutar-sp

Por si alguno le interesa:
Llamar con command

A mí me valía con

Dim cSql as String
Dim cSql = " execute miProceimiento ‘parametro1’, ‘parametro2’ "
Set rst = New ADODB.Recordset
rst.Open cSql, gConexion, adOpenForwardOnly, adLockReadOnly
If Not rst.EOF Then

End if

9 comentarios:

  1. Estimado,

    Muchas gracias por compartir este post, ya tenia un par de horas dándole vuelta al tema.

    Saludos,

    ON

    ResponderEliminar
  2. Muchas gracias hermano me has sacado de este error

    ResponderEliminar
  3. Mil Gracias, pase dos días sin saber q le pasa al sp y con esto ya esta resuelto.
    ¡Éxitos!

    ResponderEliminar
  4. 5 Horas después y era eso, me salvaste el día. Te envió un abrazo de gol

    ResponderEliminar
  5. y saben por que el SET NOCOUNT ON y SET NOCOUNT OFF afecta?

    ResponderEliminar
  6. excelente, gracias estimados. Saludos desde Ecuador

    ResponderEliminar
  7. Muy buena la solución.
    En mi caso particular, tuve que poner el SET NOCOUNT ON solamente (con ambos no funcionaba) y ahí anduvo todo bien (uso ADO 2.8 + SQL 2017)

    ResponderEliminar