Problemas con el status de los SP con ADO

18/01/2005 - 22:52 por Leonardo Azpurua | Informe spam
Hola.

Este es un SP simplísimo, para ejemplificar un problema planteado por un
usuario en el grupo de VB y para el que aun no encuentro solucion:

ALTER PROCEDURE DBO.AddRGemma
(@Grp NVARCHAR(3))
AS
INSERT INTO Gemma (Grupo, Importe1, Importe2) VALUES (@Grp, 0, 0)
IF @@ERROR <> 0
BEGIN
RAISERROR( 'ERROR EN AddRGemma', 16, 10)
END

si el SP se corre desde el QueryAnalizer pasando en @Grp un valor ya
registrado en Grupo (es la PK), se muestran tres mensajes de error: dos
generados por el servidor, seguidos por el que se levanta desde el SP.

Pero cuando la aplicacion se corre desde VB6, la coleccion Errors de la
conexion se llena solo con los dos primeros errores.

Alguien me sugirió que reemplazara RAISERROR por PRINT, pero el resultado es
el mismo.

Se me ocurrió incluir un PRINT antes del INSERT INTO, y la situacion es
muchísimo peor: no se produce ningún error en la aplicacion cliente. Si uno
examina la coleccion Errors de la conexión, solo hay una entrada cuya
descripcion es el texto enviado en Print. La instruccion, por supuesto, no
se ejecuta, pero no hay ninguna advertencia.

Sin duda, el problema no esta en SQL Server, sino en la interfaz (el
proveedor OLEDB para SQL Server, instalado con ADO 2.8). De cualquier
manera, no creo que se pierda nada preguntando aquí.

Salud!

Preguntas similare

Leer las respuestas

#1 MAXI
19/01/2005 - 00:22 | Informe spam
Hola Leo como estas? a ver, algunas modificaciones a ese SP para ver que
sucede ;)

ALTER PROCEDURE DBO.AddRGemma
SET NOCOUNT ON
(@Grp NVARCHAR(3))
AS
INSERT INTO Gemma (Grupo, Importe1, Importe2) VALUES (@Grp, 0, 0)
IF @@ERROR <> 0
BEGIN
RAISERROR( 'ERROR EN AddRGemma', 16, 10)
RETURN 99
END


PD: proba con el mdac 2.8 porfavor y contame si con esto te funciona :-)



Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)

"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:uXfVnca$
Hola.

Este es un SP simplísimo, para ejemplificar un problema planteado por un
usuario en el grupo de VB y para el que aun no encuentro solucion:

ALTER PROCEDURE DBO.AddRGemma
(@Grp NVARCHAR(3))
AS
INSERT INTO Gemma (Grupo, Importe1, Importe2) VALUES (@Grp, 0, 0)
IF @@ERROR <> 0
BEGIN
RAISERROR( 'ERROR EN AddRGemma', 16, 10)
END

si el SP se corre desde el QueryAnalizer pasando en @Grp un valor ya
registrado en Grupo (es la PK), se muestran tres mensajes de error: dos
generados por el servidor, seguidos por el que se levanta desde el SP.

Pero cuando la aplicacion se corre desde VB6, la coleccion Errors de la
conexion se llena solo con los dos primeros errores.

Alguien me sugirió que reemplazara RAISERROR por PRINT, pero el resultado
es el mismo.

Se me ocurrió incluir un PRINT antes del INSERT INTO, y la situacion es
muchísimo peor: no se produce ningún error en la aplicacion cliente. Si
uno examina la coleccion Errors de la conexión, solo hay una entrada cuya
descripcion es el texto enviado en Print. La instruccion, por supuesto, no
se ejecuta, pero no hay ninguna advertencia.

Sin duda, el problema no esta en SQL Server, sino en la interfaz (el
proveedor OLEDB para SQL Server, instalado con ADO 2.8). De cualquier
manera, no creo que se pierda nada preguntando aquí.

Salud!


Respuesta Responder a este mensaje
#2 Edgar Contreras
19/01/2005 - 02:16 | Informe spam
Leonardo, creo que las siguientes ligas te pueden ayudar:

How To Process Multiple Recordsets and Messages in ADO
http://support.microsoft.com/defaul...-us;245179

How To Retrieve Values in SQL Server Stored Procedures with ADO
http://support.microsoft.com/defaul...-us;194792

Using Return Code and Output Parameters for Stored Procedures
http://msdn.microsoft.com/library/d...2_525v.asp

RETURN
http://msdn.microsoft.com/library/d...z_05im.asp


Saludos,

Edgar Contreras


[Conectado desde Tijuana, B.C. México]

DISCLAIMER: La información es presentada como es, sin ninguna
responsabilidad, sin garantía alguna y no otorga
derecho alguno.



"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> wrote in
message news:uXfVnca$
Hola.

Este es un SP simplísimo, para ejemplificar un problema planteado por un
usuario en el grupo de VB y para el que aun no encuentro solucion:

ALTER PROCEDURE DBO.AddRGemma
(@Grp NVARCHAR(3))
AS
INSERT INTO Gemma (Grupo, Importe1, Importe2) VALUES (@Grp, 0, 0)
IF @@ERROR <> 0
BEGIN
RAISERROR( 'ERROR EN AddRGemma', 16, 10)
END

si el SP se corre desde el QueryAnalizer pasando en @Grp un valor ya
registrado en Grupo (es la PK), se muestran tres mensajes de error: dos
generados por el servidor, seguidos por el que se levanta desde el SP.

Pero cuando la aplicacion se corre desde VB6, la coleccion Errors de la
conexion se llena solo con los dos primeros errores.

Alguien me sugirió que reemplazara RAISERROR por PRINT, pero el resultado
es el mismo.

Se me ocurrió incluir un PRINT antes del INSERT INTO, y la situacion es
muchísimo peor: no se produce ningún error en la aplicacion cliente. Si
uno examina la coleccion Errors de la conexión, solo hay una entrada cuya
descripcion es el texto enviado en Print. La instruccion, por supuesto, no
se ejecuta, pero no hay ninguna advertencia.

Sin duda, el problema no esta en SQL Server, sino en la interfaz (el
proveedor OLEDB para SQL Server, instalado con ADO 2.8). De cualquier
manera, no creo que se pierda nada preguntando aquí.

Salud!


Respuesta Responder a este mensaje
#3 Maxi
19/01/2005 - 14:01 | Informe spam
Hola Leo, con mucho gusto te puedo explicar.

Observa primero que puse un SET NOCOUNT esto es importante porque sino el
ADO recebira varios mensajes, no solo los de errores sino tambien los de
filas afectadas. Al ponerlo en ON lo que hacemos es que el SP no retorne
filas afectadas y esas yerbas :-)

Ademas te faltaba el RETURN <> 0, todo SP cuando generas un error lo
deberias cortar con un return <> 0 para que ese valor llegue al returnvalue
del ADO, si es 0 quiere decir que no hay errores, por eso le puse 99 :-D

Espero haber sido claro :-S


Salu2
Maxi


"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:Oh9KITd$

"MAXI" escribió en el mensaje
news:eXV4ESb$
Hola Leo como estas? a ver, algunas modificaciones a ese SP para ver que
sucede ;)

ALTER PROCEDURE DBO.AddRGemma
SET NOCOUNT ON
(@Grp NVARCHAR(3))
AS
INSERT INTO Gemma (Grupo, Importe1, Importe2) VALUES (@Grp, 0, 0)
IF @@ERROR <> 0
BEGIN
RAISERROR( 'ERROR EN AddRGemma', 16, 10)
RETURN 99
END



¡Funciona!

¿Puedes explicarme por qué este funciona y la versión original no?

Gracias!


Respuesta Responder a este mensaje
#4 Leonardo Azpurua
19/01/2005 - 15:17 | Informe spam
"Maxi" escribió en el mensaje
news:O2o1ubi$
Hola Leo, con mucho gusto te puedo explicar.

Observa primero que puse un SET NOCOUNT esto es importante porque sino el
ADO recebira varios mensajes, no solo los de errores sino tambien los de
filas afectadas. Al ponerlo en ON lo que hacemos es que el SP no retorne
filas afectadas y esas yerbas :-)

Ademas te faltaba el RETURN <> 0, todo SP cuando generas un error lo
deberias cortar con un return <> 0 para que ese valor llegue al
returnvalue del ADO, si es 0 quiere decir que no hay errores, por eso le
puse 99 :-D

Espero haber sido claro :-S



Si, claro que claro fuiste.

Como te imaginarás, soy curioso, y me puse a probar difrentes combinaciones
sobre lo que me diste.

La conclusión es que basta con SET NOCOUNT ON. Si pones o dejas el RETURN !=
0 el mecanismo completo (es decir, el llenado de la coleccion Errors y el
levantamiento del error a nivel de aplicacion) funciona correctamente.

Incluso, si coloco un PRINT antes de cualquier error, que con NOCOUNT OFF
impide que ADO genere los errores que se producen despues, cuando NOCOUNT
esta en ON tambien funciona correctamente.

De manera que colocar NOCOUNT en ON es imprescindible para ejecutar un SP
desde ADO (absurdo es, pero asi funciona).

En algun lugar debe existir un conjunto de API nativas para la comunicacion
con SQL Server (es decir, pasando de ADO). ¿Tienes idea de dónde?

Salud!
Respuesta Responder a este mensaje
#5 Maxi
19/01/2005 - 15:25 | Informe spam
Hola Leo, has llegado a una linda conclusion y es ademas una de las
recomendaciones quese hacemos a muchos desarrolladores, el uso de SET
NOCOUNT es fundamental.
El RETURN es por una cuestion de prolijidad y ademas podrias desde el ADO
saber si existio un error, imaginate que no quieres hacer el raiserror y
solo devolver un numero de error que luego puede ser interpretado por la
aplicacion, como hace sqlserver por ej, hasta los mensajes podrian estar en
mas de un idioma :-)

En algun lugar debe existir un conjunto de API nativas para la
comunicacion con SQL Server (es decir, pasando de ADO). ¿Tienes idea de
dónde?




API nativas, mmm yo siempre use ADO o ADO.NET, para que buscas las API
nativas?


Salu2
Maxi


"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:%238GZ2Cj$

"Maxi" escribió en el mensaje
news:O2o1ubi$
Hola Leo, con mucho gusto te puedo explicar.

Observa primero que puse un SET NOCOUNT esto es importante porque sino el
ADO recebira varios mensajes, no solo los de errores sino tambien los de
filas afectadas. Al ponerlo en ON lo que hacemos es que el SP no retorne
filas afectadas y esas yerbas :-)

Ademas te faltaba el RETURN <> 0, todo SP cuando generas un error lo
deberias cortar con un return <> 0 para que ese valor llegue al
returnvalue del ADO, si es 0 quiere decir que no hay errores, por eso le
puse 99 :-D

Espero haber sido claro :-S



Si, claro que claro fuiste.

Como te imaginarás, soy curioso, y me puse a probar difrentes
combinaciones sobre lo que me diste.

La conclusión es que basta con SET NOCOUNT ON. Si pones o dejas el RETURN
!= 0 el mecanismo completo (es decir, el llenado de la coleccion Errors y
el levantamiento del error a nivel de aplicacion) funciona correctamente.

Incluso, si coloco un PRINT antes de cualquier error, que con NOCOUNT OFF
impide que ADO genere los errores que se producen despues, cuando NOCOUNT
esta en ON tambien funciona correctamente.

De manera que colocar NOCOUNT en ON es imprescindible para ejecutar un SP
desde ADO (absurdo es, pero asi funciona).

En algun lugar debe existir un conjunto de API nativas para la
comunicacion con SQL Server (es decir, pasando de ADO). ¿Tienes idea de
dónde?

Salud!



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida