SQL->RAISEERROR->VB6

01/04/2005 - 18:12 por Gustavo | Informe spam
Hola Muchachos:

Tengo el problema de que en una aplicacion VB6 no me
captura los errores "fabricados" con RAISEERROR en Stores
Procedures de SQL Server que invoco desde VB6 utilizando
el objeto ADODB.Command

El tema es que invoco el objetoCommand.Execute, ejecuta el
stored procedure pero -a pesar de tener la seguridad de
que el RAISEERROR fue invocado- no me devuelve nada en la
coleccion del objeto VB6->Err ni tampoco en la coleccion
objetoCommand.Activeconnection.Errors

Les mado un ejemplito:

VB6

Private Sub Command1_Click()
On Error Resume Next
Dim lobjCommand As ADODB.Command
Set lobjCommand = New ADODB.Command
With lobjCommand
'//Inicializa comando
.CommandTimeout = 60
.CommandType = adCmdStoredProc
.ActiveConnection = DBSeguridad

'//Ejecuta comando
.CommandText = "_Pruebas"
.Execute
End With
Set lobjCommand = Nothing
End Sub

SQL SERVER

(En este ejemplo se va por el RAISEERROR / RETURN en el
segundo INSERT ya que la longitud del campo que se
pretende insertar es mayor a la definida en la tabla - NO
ME CAPTURA EL ERROR EN VISUAL!!!)

CREATE PROCEDURE _Pruebas
AS
DECLARE @myerror int
DECLARE @mydescerror varchar(100)
INSERT INTO _Test (Test) VALUES ('Texto Uno')
SET @myerror = @@ERROR
IF @myerror <> 0
Begin
SET @mydescerror = 'Se produjo el error: ' + convert
(varchar,@myerror) + ' en la instrucción: INSERT INTO
_Test'
RAISERROR (@mydescerror, 16, 1)
Return 4000
end
que se pretende insertar es mayor a la definida en la tabla
INSERT INTO _Test (Test) VALUES ('Texto Dos
SDFSDFSDFSDFSDFS')
SET @myerror = @@ERROR
IF @myerror <> 0
Begin
SET @mydescerror = 'Se produjo el error: ' + convert
(varchar,@myerror) + ' en la instrucción: INSERT INTO
_Test'
RAISERROR (@mydescerror, 16, 1)
Return 4000
end
INSERT INTO _Test (Test) VALUES ('Texto Tres')
SET @myerror = @@ERROR
IF @myerror <> 0
Begin
SET @mydescerror = 'Se produjo el error: ' + convert
(varchar,@myerror) + ' en la instrucción: INSERT INTO
_Test'
RAISERROR (@mydescerror, 16, 1)
Return 4000
end

Gracias!!
Gustavo.

Preguntas similare

Leer las respuestas

#6 Anonimo
04/04/2005 - 15:27 | Informe spam
Hola Alejandro:

Logre que funcione y hasta me retorna el valor 4000 en el
parametro de retorno del objeto command. El tema ahora es
que me trae el primer error que tira el SQL y no el que
personalice con RAISEERROR. Tengo todo como me lo pediste
pero no me personaliza el error.

Que puede estar faltando ?

Gracias,
Gustavo.

Gustavo,

Cual es el valor de retorno, adicionastes un parametro


adParamReturnValue a
la coleccion de parametros del comando?. Deberia darte


4000 si en realidad
esta pasando por el raiserror. Una ultima cosa, agrega la


opcion WITH NOWAIT
al comando RAISERROR. Tambien puedes debuguear el


procedimiento para
corroborar que pasa por el raiserror.


RAISERROR (@mydescerror, 16, 1) WITH NOWAIT
Return 4000



AMB

"Gustavo" wrote:

Gracias alejandro pero omiti decir que en el modo




DEBBUG
de VB6 al pasar por el comando .Execute detengo el
programa y no me captura el error en las colecciones de
errores mencionadas. Por ende es indistinto lo del on
error resume next porque este o no este (lo probe de




todas
formas) me sigue sin capturar el error.

Lo del set nocount on lo conozco, de hecho tuve el
problema que mencionas y seteandolo asi me devuelve los
recordsers bien. Lo que no entendà­ es como se usa
Recordset.NextRecorset, me suena interesante.

Un Abtazo,
Gustavo.

>Gustavo,
>
>Si usas "On Error Resume Next", claros que no vas a
capturar el error.
>
>Private Sub Command1_Click()
>
>On Error GoTo ErrorHandler
>
>Dim lobjCommand As ADODB.Command
>
>Set lobjCommand = New ADODB.Command
>With lobjCommand
> '//Inicializa comando
> .CommandTimeout = 60
> .CommandType = adCmdStoredProc
> .ActiveConnection = DBSeguridad
>
> '//Ejecuta comando
> .CommandText = "_Pruebas"
> .Execute
>End With
>
>Set lobjCommand = Nothing
>
>ErrorHandler:
> MsgBox (Err.Description)
> Set lobjCommand = Nothing
>End Sub
>
>Una recomendacion es que en tus procedimientos
almacenados siempre uses SET
>NOCOUNT ON como primera linea del cuerpo, de lo




contrario
tendras que usar
>Recordset.NextRecorset para capturar los distintos
recordsets generados por
>el procedimiento producto del mensaje ((xxx row(s)
affected)) de filas
>afectadas que envia sql server por cada statement
select / insert / update /
>delete hacia la alicacion cliente y los cuales deben
manipularse o cerrarse
>(los recordsets) antes de tener acceso al valor de
retorno o a los valores de
>los parametros de salido del procedimiento.
>
>
>AMB
>
>
>"Gustavo" wrote:
>
>> Hola Muchachos:
>>
>> Tengo el problema de que en una aplicacion VB6 no me
>> captura los errores "fabricados" con RAISEERROR en
Stores
>> Procedures de SQL Server que invoco desde VB6
utilizando
>> el objeto ADODB.Command
>>
>> El tema es que invoco el objetoCommand.Execute,




ejecuta
el
>> stored procedure pero -a pesar de tener la seguridad




de
>> que el RAISEERROR fue invocado- no me devuelve nada




en
la
>> coleccion del objeto VB6->Err ni tampoco en la
coleccion
>> objetoCommand.Activeconnection.Errors
>>
>> Les mado un ejemplito:
>>
>> VB6
>>
>> Private Sub Command1_Click()
>> On Error Resume Next
>> Dim lobjCommand As ADODB.Command
>> Set lobjCommand = New ADODB.Command
>> With lobjCommand
>> '//Inicializa comando
>> .CommandTimeout = 60
>> .CommandType = adCmdStoredProc
>> .ActiveConnection = DBSeguridad
>>
>> '//Ejecuta comando
>> .CommandText = "_Pruebas"
>> .Execute
>> End With
>> Set lobjCommand = Nothing
>> End Sub
>>
>> SQL SERVER
>>
>> (En este ejemplo se va por el RAISEERROR / RETURN en




el
>> segundo INSERT ya que la longitud del campo que se
>> pretende insertar es mayor a la definida en la




tabla -
NO
>> ME CAPTURA EL ERROR EN VISUAL!!!)
>>
>> CREATE PROCEDURE _Pruebas
>> AS
>> DECLARE @myerror int
>> DECLARE @mydescerror varchar(100)
>> INSERT INTO _Test (Test) VALUES ('Texto Uno')
>> SET @myerror = @@ERROR
>> IF @myerror <> 0
>> Begin
>> SET @mydescerror = 'Se produjo el error: ' +
convert
>> (varchar,@myerror) + ' en la instrucciàf³n:




INSERT
INTO
>> _Test'
>> RAISERROR (@mydescerror, 16, 1)
>> Return 4000
>> end




del
campo
>> que se pretende insertar es mayor a la definida en




la
tabla
>> INSERT INTO _Test (Test) VALUES ('Texto Dos
>> SDFSDFSDFSDFSDFS')
>> SET @myerror = @@ERROR
>> IF @myerror <> 0
>> Begin
>> SET @mydescerror = 'Se produjo el error: ' +
convert
>> (varchar,@myerror) + ' en la instrucciàf³n:




INSERT
INTO
>> _Test'
>> RAISERROR (@mydescerror, 16, 1)
>> Return 4000
>> end
>> INSERT INTO _Test (Test) VALUES ('Texto Tres')
>> SET @myerror = @@ERROR
>> IF @myerror <> 0
>> Begin
>> SET @mydescerror = 'Se produjo el error: ' +
convert
>> (varchar,@myerror) + ' en la instrucciàf³n:




INSERT
INTO
>> _Test'
>> RAISERROR (@mydescerror, 16, 1)
>> Return 4000
>> end
>>
>> Gracias!!
>> Gustavo.
>>
>.
>



.

Respuesta Responder a este mensaje
#7 Alejandro Mesa
04/04/2005 - 15:37 | Informe spam
Gustavo,

Cual es el error?
Puedes postear mas informacion al respecto?


AMB

"" wrote:

Hola Alejandro:

Logre que funcione y hasta me retorna el valor 4000 en el
parametro de retorno del objeto command. El tema ahora es
que me trae el primer error que tira el SQL y no el que
personalice con RAISEERROR. Tengo todo como me lo pediste
pero no me personaliza el error.

Que puede estar faltando ?

Gracias,
Gustavo.

>Gustavo,
>
>Cual es el valor de retorno, adicionastes un parametro
adParamReturnValue a
>la coleccion de parametros del comando?. Deberia darte
4000 si en realidad
>esta pasando por el raiserror. Una ultima cosa, agrega la
opcion WITH NOWAIT
>al comando RAISERROR. Tambien puedes debuguear el
procedimiento para
>corroborar que pasa por el raiserror.
>
>
>RAISERROR (@mydescerror, 16, 1) WITH NOWAIT
>Return 4000
>
>
>
>AMB
>
>"Gustavo" wrote:
>
>> Gracias alejandro pero omiti decir que en el modo
DEBBUG
>> de VB6 al pasar por el comando .Execute detengo el
>> programa y no me captura el error en las colecciones de
>> errores mencionadas. Por ende es indistinto lo del on
>> error resume next porque este o no este (lo probe de
todas
>> formas) me sigue sin capturar el error.
>>
>> Lo del set nocount on lo conozco, de hecho tuve el
>> problema que mencionas y seteandolo asi me devuelve los
>> recordsers bien. Lo que no entendà­ es como se usa
>> Recordset.NextRecorset, me suena interesante.
>>
>> Un Abtazo,
>> Gustavo.
>>
>> >Gustavo,
>> >
>> >Si usas "On Error Resume Next", claros que no vas a
>> capturar el error.
>> >
>> >Private Sub Command1_Click()
>> >
>> >On Error GoTo ErrorHandler
>> >
>> >Dim lobjCommand As ADODB.Command
>> >
>> >Set lobjCommand = New ADODB.Command
>> >With lobjCommand
>> > '//Inicializa comando
>> > .CommandTimeout = 60
>> > .CommandType = adCmdStoredProc
>> > .ActiveConnection = DBSeguridad
>> >
>> > '//Ejecuta comando
>> > .CommandText = "_Pruebas"
>> > .Execute
>> >End With
>> >
>> >Set lobjCommand = Nothing
>> >
>> >ErrorHandler:
>> > MsgBox (Err.Description)
>> > Set lobjCommand = Nothing
>> >End Sub
>> >
>> >Una recomendacion es que en tus procedimientos
>> almacenados siempre uses SET
>> >NOCOUNT ON como primera linea del cuerpo, de lo
contrario
>> tendras que usar
>> >Recordset.NextRecorset para capturar los distintos
>> recordsets generados por
>> >el procedimiento producto del mensaje ((xxx row(s)
>> affected)) de filas
>> >afectadas que envia sql server por cada statement
>> select / insert / update /
>> >delete hacia la alicacion cliente y los cuales deben
>> manipularse o cerrarse
>> >(los recordsets) antes de tener acceso al valor de
>> retorno o a los valores de
>> >los parametros de salido del procedimiento.
>> >
>> >
>> >AMB
>> >
>> >
>> >"Gustavo" wrote:
>> >
>> >> Hola Muchachos:
>> >>
>> >> Tengo el problema de que en una aplicacion VB6 no me
>> >> captura los errores "fabricados" con RAISEERROR en
>> Stores
>> >> Procedures de SQL Server que invoco desde VB6
>> utilizando
>> >> el objeto ADODB.Command
>> >>
>> >> El tema es que invoco el objetoCommand.Execute,
ejecuta
>> el
>> >> stored procedure pero -a pesar de tener la seguridad
de
>> >> que el RAISEERROR fue invocado- no me devuelve nada
en
>> la
>> >> coleccion del objeto VB6->Err ni tampoco en la
>> coleccion
>> >> objetoCommand.Activeconnection.Errors
>> >>
>> >> Les mado un ejemplito:
>> >>
>> >> VB6
>> >>
>> >> Private Sub Command1_Click()
>> >> On Error Resume Next
>> >> Dim lobjCommand As ADODB.Command
>> >> Set lobjCommand = New ADODB.Command
>> >> With lobjCommand
>> >> '//Inicializa comando
>> >> .CommandTimeout = 60
>> >> .CommandType = adCmdStoredProc
>> >> .ActiveConnection = DBSeguridad
>> >>
>> >> '//Ejecuta comando
>> >> .CommandText = "_Pruebas"
>> >> .Execute
>> >> End With
>> >> Set lobjCommand = Nothing
>> >> End Sub
>> >>
>> >> SQL SERVER
>> >>
>> >> (En este ejemplo se va por el RAISEERROR / RETURN en
el
>> >> segundo INSERT ya que la longitud del campo que se
>> >> pretende insertar es mayor a la definida en la
tabla -
>> NO
>> >> ME CAPTURA EL ERROR EN VISUAL!!!)
>> >>
>> >> CREATE PROCEDURE _Pruebas
>> >> AS
>> >> DECLARE @myerror int
>> >> DECLARE @mydescerror varchar(100)
>> >> INSERT INTO _Test (Test) VALUES ('Texto Uno')
>> >> SET @myerror = @@ERROR
>> >> IF @myerror <> 0
>> >> Begin
>> >> SET @mydescerror = 'Se produjo el error: ' +
>> convert
>> >> (varchar,@myerror) + ' en la instrucciàf³n:
INSERT
>> INTO
>> >> _Test'
>> >> RAISERROR (@mydescerror, 16, 1)
>> >> Return 4000
>> >> end
del
>> campo
>> >> que se pretende insertar es mayor a la definida en
la
>> tabla
>> >> INSERT INTO _Test (Test) VALUES ('Texto Dos
>> >> SDFSDFSDFSDFSDFS')
>> >> SET @myerror = @@ERROR
>> >> IF @myerror <> 0
>> >> Begin
>> >> SET @mydescerror = 'Se produjo el error: ' +
>> convert
>> >> (varchar,@myerror) + ' en la instrucciàf³n:
INSERT
>> INTO
>> >> _Test'
>> >> RAISERROR (@mydescerror, 16, 1)
>> >> Return 4000
>> >> end
>> >> INSERT INTO _Test (Test) VALUES ('Texto Tres')
>> >> SET @myerror = @@ERROR
>> >> IF @myerror <> 0
>> >> Begin
>> >> SET @mydescerror = 'Se produjo el error: ' +
>> convert
>> >> (varchar,@myerror) + ' en la instrucciàf³n:
INSERT
>> INTO
>> >> _Test'
>> >> RAISERROR (@mydescerror, 16, 1)
>> >> Return 4000
>> >> end
>> >>
>> >> Gracias!!
>> >> Gustavo.
>> >>
>> >.
>> >
>>
>.
>

Respuesta Responder a este mensaje
#8 Gustavo
04/04/2005 - 16:01 | Informe spam
Este es el error que me tira el SQl

"String or binary data would be truncated."

Surge del siguiente codigo:

la definida en la tabla
INSERT INTO _Test (Test) VALUES ('Texto Dos
SDFSDFSDFSDFSDFS')

Considerando que ya tengo el SET NOCOUNT ON inmediatamante
despues del insert hago:

SET @myerror = @@ERROR
IF @myerror <> 0
Begin
SET @mydescerror = 'Se produjo el error: ' + convert
(varchar,@myerror) + ' en la instrucción: INSERT INTO
tbNovedadFact'
RAISERROR (@mydescerror, 16, 1) WITH NOWAIT
Return 4000
end

Esto me retorna en VB6 Err.Description="String or binary
data would be truncated." en vez del error que le
personalice con raiseerror.

Un darto mas:

Teniendo este chiquitisimo store procedure en VB6 en la
descripcion del error me trae un espacio en blanco
(Err.Description=" "). Es como que no esta reconociendo el
string de error que le paso al RAISEERROR. Tendara que ver
con la tabla sysmessages y el nivel 50000 ?

CREATE PROCEDURE _Pruebas
AS

SET NOCOUNT ON

DECLARE @myerror int
DECLARE @mydescerror varchar(100)

SET @mydescerror = 'Se produjo el error: ' + convert
(varchar,@myerror) + ' en la instrucción: INSERT INTO
tbNovedadFact'
RAISERROR (@mydescerror, 16, 1) WITH NOWAIT
Return 4000

en VB6 me trae captura el error pero con el string " " en
vez de la descripcion que le pase ... raro no ?

Gracias,
Gustavo.

Gustavo,

Cual es el error?
Puedes postear mas informacion al respecto?


AMB

"" wrote:

Hola Alejandro:

Logre que funcione y hasta me retorna el valor 4000 en




el
parametro de retorno del objeto command. El tema ahora




es
que me trae el primer error que tira el SQL y no el que
personalice con RAISEERROR. Tengo todo como me lo




pediste
pero no me personaliza el error.

Que puede estar faltando ?

Gracias,
Gustavo.

>Gustavo,
>
>Cual es el valor de retorno, adicionastes un parametro
adParamReturnValue a
>la coleccion de parametros del comando?. Deberia darte
4000 si en realidad
>esta pasando por el raiserror. Una ultima cosa, agrega




la
opcion WITH NOWAIT
>al comando RAISERROR. Tambien puedes debuguear el
procedimiento para
>corroborar que pasa por el raiserror.
>
>
>RAISERROR (@mydescerror, 16, 1) WITH NOWAIT
>Return 4000
>
>
>
>AMB
>
>"Gustavo" wrote:
>
>> Gracias alejandro pero omiti decir que en el modo
DEBBUG
>> de VB6 al pasar por el comando .Execute detengo el
>> programa y no me captura el error en las colecciones




de
>> errores mencionadas. Por ende es indistinto lo del




on
>> error resume next porque este o no este (lo probe de
todas
>> formas) me sigue sin capturar el error.
>>
>> Lo del set nocount on lo conozco, de hecho tuve el
>> problema que mencionas y seteandolo asi me devuelve




los
>> recordsers bien. Lo que no entendàf­ es como se usa
>> Recordset.NextRecorset, me suena interesante.
>>
>> Un Abtazo,
>> Gustavo.
>>
>> >Gustavo,
>> >
>> >Si usas "On Error Resume Next", claros que no vas a
>> capturar el error.
>> >
>> >Private Sub Command1_Click()
>> >
>> >On Error GoTo ErrorHandler
>> >
>> >Dim lobjCommand As ADODB.Command
>> >
>> >Set lobjCommand = New ADODB.Command
>> >With lobjCommand
>> > '//Inicializa comando
>> > .CommandTimeout = 60
>> > .CommandType = adCmdStoredProc
>> > .ActiveConnection = DBSeguridad
>> >
>> > '//Ejecuta comando
>> > .CommandText = "_Pruebas"
>> > .Execute
>> >End With
>> >
>> >Set lobjCommand = Nothing
>> >
>> >ErrorHandler:
>> > MsgBox (Err.Description)
>> > Set lobjCommand = Nothing
>> >End Sub
>> >
>> >Una recomendacion es que en tus procedimientos
>> almacenados siempre uses SET
>> >NOCOUNT ON como primera linea del cuerpo, de lo
contrario
>> tendras que usar
>> >Recordset.NextRecorset para capturar los distintos
>> recordsets generados por
>> >el procedimiento producto del mensaje ((xxx row(s)
>> affected)) de filas
>> >afectadas que envia sql server por cada statement
>> select / insert / update /
>> >delete hacia la alicacion cliente y los cuales




deben
>> manipularse o cerrarse
>> >(los recordsets) antes de tener acceso al valor de
>> retorno o a los valores de
>> >los parametros de salido del procedimiento.
>> >
>> >
>> >AMB
>> >
>> >
>> >"Gustavo" wrote:
>> >
>> >> Hola Muchachos:
>> >>
>> >> Tengo el problema de que en una aplicacion VB6 no




me
>> >> captura los errores "fabricados" con RAISEERROR




en
>> Stores
>> >> Procedures de SQL Server que invoco desde VB6
>> utilizando
>> >> el objeto ADODB.Command
>> >>
>> >> El tema es que invoco el objetoCommand.Execute,
ejecuta
>> el
>> >> stored procedure pero -a pesar de tener la




seguridad
de
>> >> que el RAISEERROR fue invocado- no me devuelve




nada
en
>> la
>> >> coleccion del objeto VB6->Err ni tampoco en la
>> coleccion
>> >> objetoCommand.Activeconnection.Errors
>> >>
>> >> Les mado un ejemplito:
>> >>
>> >> VB6
>> >>
>> >> Private Sub Command1_Click()
>> >> On Error Resume Next
>> >> Dim lobjCommand As ADODB.Command
>> >> Set lobjCommand = New ADODB.Command
>> >> With lobjCommand
>> >> '//Inicializa comando
>> >> .CommandTimeout = 60
>> >> .CommandType = adCmdStoredProc
>> >> .ActiveConnection = DBSeguridad
>> >>
>> >> '//Ejecuta comando
>> >> .CommandText = "_Pruebas"
>> >> .Execute
>> >> End With
>> >> Set lobjCommand = Nothing
>> >> End Sub
>> >>
>> >> SQL SERVER
>> >>
>> >> (En este ejemplo se va por el RAISEERROR / RETURN




en
el
>> >> segundo INSERT ya que la longitud del campo que




se
>> >> pretende insertar es mayor a la definida en la
tabla -
>> NO
>> >> ME CAPTURA EL ERROR EN VISUAL!!!)
>> >>
>> >> CREATE PROCEDURE _Pruebas
>> >> AS
>> >> DECLARE @myerror int
>> >> DECLARE @mydescerror varchar(100)
>> >> INSERT INTO _Test (Test) VALUES ('Texto Uno')
>> >> SET @myerror = @@ERROR
>> >> IF @myerror <> 0
>> >> Begin
>> >> SET @mydescerror = 'Se produjo el error: ' +
>> convert
>> >> (varchar,@myerror) + ' en la instrucciàffà,³n:
INSERT
>> INTO
>> >> _Test'
>> >> RAISERROR (@mydescerror, 16, 1)
>> >> Return 4000
>> >> end




longitud
del
>> campo
>> >> que se pretende insertar es mayor a la definida




en
la
>> tabla
>> >> INSERT INTO _Test (Test) VALUES ('Texto Dos
>> >> SDFSDFSDFSDFSDFS')
>> >> SET @myerror = @@ERROR
>> >> IF @myerror <> 0
>> >> Begin
>> >> SET @mydescerror = 'Se produjo el error: ' +
>> convert
>> >> (varchar,@myerror) + ' en la instrucciàffà,³n:
INSERT
>> INTO
>> >> _Test'
>> >> RAISERROR (@mydescerror, 16, 1)
>> >> Return 4000
>> >> end
>> >> INSERT INTO _Test (Test) VALUES ('Texto Tres')
>> >> SET @myerror = @@ERROR
>> >> IF @myerror <> 0
>> >> Begin
>> >> SET @mydescerror = 'Se produjo el error: ' +
>> convert
>> >> (varchar,@myerror) + ' en la instrucciàffà,³n:
INSERT
>> INTO
>> >> _Test'
>> >> RAISERROR (@mydescerror, 16, 1)
>> >> Return 4000
>> >> end
>> >>
>> >> Gracias!!
>> >> Gustavo.
>> >>
>> >.
>> >
>>
>.
>



.

Respuesta Responder a este mensaje
#9 Gustavo
04/04/2005 - 16:04 | Informe spam
Perdon, el ultimo ejemplito anda bien, osea, si no hay un
error previo tirado por el sql (el insert que no puede
hacer) me tira el error que personalice. Sino por mas que
le mande lo que le mande al RAISEERROR me llega el error
original: Habrá que blanquear el error de SQL y luego
tirar el RAISEERROR ?

Gustavo,

Cual es el error?
Puedes postear mas informacion al respecto?


AMB

"" wrote:

Hola Alejandro:

Logre que funcione y hasta me retorna el valor 4000 en




el
parametro de retorno del objeto command. El tema ahora




es
que me trae el primer error que tira el SQL y no el que
personalice con RAISEERROR. Tengo todo como me lo




pediste
pero no me personaliza el error.

Que puede estar faltando ?

Gracias,
Gustavo.

>Gustavo,
>
>Cual es el valor de retorno, adicionastes un parametro
adParamReturnValue a
>la coleccion de parametros del comando?. Deberia darte
4000 si en realidad
>esta pasando por el raiserror. Una ultima cosa, agrega




la
opcion WITH NOWAIT
>al comando RAISERROR. Tambien puedes debuguear el
procedimiento para
>corroborar que pasa por el raiserror.
>
>
>RAISERROR (@mydescerror, 16, 1) WITH NOWAIT
>Return 4000
>
>
>
>AMB
>
>"Gustavo" wrote:
>
>> Gracias alejandro pero omiti decir que en el modo
DEBBUG
>> de VB6 al pasar por el comando .Execute detengo el
>> programa y no me captura el error en las colecciones




de
>> errores mencionadas. Por ende es indistinto lo del




on
>> error resume next porque este o no este (lo probe de
todas
>> formas) me sigue sin capturar el error.
>>
>> Lo del set nocount on lo conozco, de hecho tuve el
>> problema que mencionas y seteandolo asi me devuelve




los
>> recordsers bien. Lo que no entendàf­ es como se usa
>> Recordset.NextRecorset, me suena interesante.
>>
>> Un Abtazo,
>> Gustavo.
>>
>> >Gustavo,
>> >
>> >Si usas "On Error Resume Next", claros que no vas a
>> capturar el error.
>> >
>> >Private Sub Command1_Click()
>> >
>> >On Error GoTo ErrorHandler
>> >
>> >Dim lobjCommand As ADODB.Command
>> >
>> >Set lobjCommand = New ADODB.Command
>> >With lobjCommand
>> > '//Inicializa comando
>> > .CommandTimeout = 60
>> > .CommandType = adCmdStoredProc
>> > .ActiveConnection = DBSeguridad
>> >
>> > '//Ejecuta comando
>> > .CommandText = "_Pruebas"
>> > .Execute
>> >End With
>> >
>> >Set lobjCommand = Nothing
>> >
>> >ErrorHandler:
>> > MsgBox (Err.Description)
>> > Set lobjCommand = Nothing
>> >End Sub
>> >
>> >Una recomendacion es que en tus procedimientos
>> almacenados siempre uses SET
>> >NOCOUNT ON como primera linea del cuerpo, de lo
contrario
>> tendras que usar
>> >Recordset.NextRecorset para capturar los distintos
>> recordsets generados por
>> >el procedimiento producto del mensaje ((xxx row(s)
>> affected)) de filas
>> >afectadas que envia sql server por cada statement
>> select / insert / update /
>> >delete hacia la alicacion cliente y los cuales




deben
>> manipularse o cerrarse
>> >(los recordsets) antes de tener acceso al valor de
>> retorno o a los valores de
>> >los parametros de salido del procedimiento.
>> >
>> >
>> >AMB
>> >
>> >
>> >"Gustavo" wrote:
>> >
>> >> Hola Muchachos:
>> >>
>> >> Tengo el problema de que en una aplicacion VB6 no




me
>> >> captura los errores "fabricados" con RAISEERROR




en
>> Stores
>> >> Procedures de SQL Server que invoco desde VB6
>> utilizando
>> >> el objeto ADODB.Command
>> >>
>> >> El tema es que invoco el objetoCommand.Execute,
ejecuta
>> el
>> >> stored procedure pero -a pesar de tener la




seguridad
de
>> >> que el RAISEERROR fue invocado- no me devuelve




nada
en
>> la
>> >> coleccion del objeto VB6->Err ni tampoco en la
>> coleccion
>> >> objetoCommand.Activeconnection.Errors
>> >>
>> >> Les mado un ejemplito:
>> >>
>> >> VB6
>> >>
>> >> Private Sub Command1_Click()
>> >> On Error Resume Next
>> >> Dim lobjCommand As ADODB.Command
>> >> Set lobjCommand = New ADODB.Command
>> >> With lobjCommand
>> >> '//Inicializa comando
>> >> .CommandTimeout = 60
>> >> .CommandType = adCmdStoredProc
>> >> .ActiveConnection = DBSeguridad
>> >>
>> >> '//Ejecuta comando
>> >> .CommandText = "_Pruebas"
>> >> .Execute
>> >> End With
>> >> Set lobjCommand = Nothing
>> >> End Sub
>> >>
>> >> SQL SERVER
>> >>
>> >> (En este ejemplo se va por el RAISEERROR / RETURN




en
el
>> >> segundo INSERT ya que la longitud del campo que




se
>> >> pretende insertar es mayor a la definida en la
tabla -
>> NO
>> >> ME CAPTURA EL ERROR EN VISUAL!!!)
>> >>
>> >> CREATE PROCEDURE _Pruebas
>> >> AS
>> >> DECLARE @myerror int
>> >> DECLARE @mydescerror varchar(100)
>> >> INSERT INTO _Test (Test) VALUES ('Texto Uno')
>> >> SET @myerror = @@ERROR
>> >> IF @myerror <> 0
>> >> Begin
>> >> SET @mydescerror = 'Se produjo el error: ' +
>> convert
>> >> (varchar,@myerror) + ' en la instrucciàffà,³n:
INSERT
>> INTO
>> >> _Test'
>> >> RAISERROR (@mydescerror, 16, 1)
>> >> Return 4000
>> >> end




longitud
del
>> campo
>> >> que se pretende insertar es mayor a la definida




en
la
>> tabla
>> >> INSERT INTO _Test (Test) VALUES ('Texto Dos
>> >> SDFSDFSDFSDFSDFS')
>> >> SET @myerror = @@ERROR
>> >> IF @myerror <> 0
>> >> Begin
>> >> SET @mydescerror = 'Se produjo el error: ' +
>> convert
>> >> (varchar,@myerror) + ' en la instrucciàffà,³n:
INSERT
>> INTO
>> >> _Test'
>> >> RAISERROR (@mydescerror, 16, 1)
>> >> Return 4000
>> >> end
>> >> INSERT INTO _Test (Test) VALUES ('Texto Tres')
>> >> SET @myerror = @@ERROR
>> >> IF @myerror <> 0
>> >> Begin
>> >> SET @mydescerror = 'Se produjo el error: ' +
>> convert
>> >> (varchar,@myerror) + ' en la instrucciàffà,³n:
INSERT
>> INTO
>> >> _Test'
>> >> RAISERROR (@mydescerror, 16, 1)
>> >> Return 4000
>> >> end
>> >>
>> >> Gracias!!
>> >> Gustavo.
>> >>
>> >.
>> >
>>
>.
>



.

Respuesta Responder a este mensaje
#10 Alejandro Mesa
04/04/2005 - 18:41 | Informe spam
Gustavo,

La colleccion de errores del objeto connection esta siendo llenada con
varioas errores, el capturado por sql y el enviado por ti. Aca te pongo un
ejemplo para que puedas verlo. En cuanto al segundo ejemplo que pusistes,
como no estas asignandole valor alguno a la variable @myerror entonces su
valor es el de por defecto, el cual es NULL y la concatenacion con NULL
resulta NULL por eso el mensaje llega una cadena vacia.

SET @mydescerror = 'Se produjo el error: ' + convert
(varchar,@myerror) + ' en la instrucción: INSERT INTO
tbNovedadFact'



select convert(varchar, NULL) + 'cualquier cosa' <-- esto dara NULL


Ejemplo:

use northwind
go

create table t (
colA varchar(25)
)
go

create procedure proc1
as
set nocount on

insert into t values(replicate('a', 26))

if @@error != 0
begin
raiserror('error inserting in table [t].', 16, 1)
return 1
end

return @@error
go

drop procedure proc1
go

drop table t
go

Private Sub Command1_Click()
On Error GoTo ErrorHandler

Dim oConn As ADODB.Connection

Set oConn = New ADODB.Connection

With oConn
.ConnectionString =
"provider=sqloledb;server=mi_server;databse=northwind;integrated
security=SSPI"
.Open
.Execute "exec dbo.proc1"
End With

Exit_Sub:

If Not oConn Is Nothing Then
If oConn.State = adStateOpen Then
oConn.Close
End If
End If

Set oConn = Nothing

Exit Sub

ErrorHandler:
Dim i As Integer

If Not oConn Is Nothing Then
For i = 0 To oConn.Errors.Count - 1
MsgBox oConn.Errors(i)
Next
End If

Resume Exit_Sub
End Sub


AMB

"Gustavo" wrote:

Este es el error que me tira el SQl

"String or binary data would be truncated."

Surge del siguiente codigo:

la definida en la tabla
INSERT INTO _Test (Test) VALUES ('Texto Dos
SDFSDFSDFSDFSDFS')

Considerando que ya tengo el SET NOCOUNT ON inmediatamante
despues del insert hago:

SET @myerror = @@ERROR
IF @myerror <> 0
Begin
SET @mydescerror = 'Se produjo el error: ' + convert
(varchar,@myerror) + ' en la instrucción: INSERT INTO
tbNovedadFact'
RAISERROR (@mydescerror, 16, 1) WITH NOWAIT
Return 4000
end

Esto me retorna en VB6 Err.Description="String or binary
data would be truncated." en vez del error que le
personalice con raiseerror.

Un darto mas:

Teniendo este chiquitisimo store procedure en VB6 en la
descripcion del error me trae un espacio en blanco
(Err.Description=" "). Es como que no esta reconociendo el
string de error que le paso al RAISEERROR. Tendara que ver
con la tabla sysmessages y el nivel 50000 ?

CREATE PROCEDURE _Pruebas
AS

SET NOCOUNT ON

DECLARE @myerror int
DECLARE @mydescerror varchar(100)

SET @mydescerror = 'Se produjo el error: ' + convert
(varchar,@myerror) + ' en la instrucción: INSERT INTO
tbNovedadFact'
RAISERROR (@mydescerror, 16, 1) WITH NOWAIT
Return 4000

en VB6 me trae captura el error pero con el string " " en
vez de la descripcion que le pase ... raro no ?

Gracias,
Gustavo.

>Gustavo,
>
>Cual es el error?
>Puedes postear mas informacion al respecto?
>
>
>AMB
>
>"" wrote:
>
>> Hola Alejandro:
>>
>> Logre que funcione y hasta me retorna el valor 4000 en
el
>> parametro de retorno del objeto command. El tema ahora
es
>> que me trae el primer error que tira el SQL y no el que
>> personalice con RAISEERROR. Tengo todo como me lo
pediste
>> pero no me personaliza el error.
>>
>> Que puede estar faltando ?
>>
>> Gracias,
>> Gustavo.
>>
>> >Gustavo,
>> >
>> >Cual es el valor de retorno, adicionastes un parametro
>> adParamReturnValue a
>> >la coleccion de parametros del comando?. Deberia darte
>> 4000 si en realidad
>> >esta pasando por el raiserror. Una ultima cosa, agrega
la
>> opcion WITH NOWAIT
>> >al comando RAISERROR. Tambien puedes debuguear el
>> procedimiento para
>> >corroborar que pasa por el raiserror.
>> >
>> >
>> >RAISERROR (@mydescerror, 16, 1) WITH NOWAIT
>> >Return 4000
>> >
>> >
>> >
>> >AMB
>> >
>> >"Gustavo" wrote:
>> >
>> >> Gracias alejandro pero omiti decir que en el modo
>> DEBBUG
>> >> de VB6 al pasar por el comando .Execute detengo el
>> >> programa y no me captura el error en las colecciones
de
>> >> errores mencionadas. Por ende es indistinto lo del
on
>> >> error resume next porque este o no este (lo probe de
>> todas
>> >> formas) me sigue sin capturar el error.
>> >>
>> >> Lo del set nocount on lo conozco, de hecho tuve el
>> >> problema que mencionas y seteandolo asi me devuelve
los
>> >> recordsers bien. Lo que no entendàf­ es como se usa
>> >> Recordset.NextRecorset, me suena interesante.
>> >>
>> >> Un Abtazo,
>> >> Gustavo.
>> >>
>> >> >Gustavo,
>> >> >
>> >> >Si usas "On Error Resume Next", claros que no vas a
>> >> capturar el error.
>> >> >
>> >> >Private Sub Command1_Click()
>> >> >
>> >> >On Error GoTo ErrorHandler
>> >> >
>> >> >Dim lobjCommand As ADODB.Command
>> >> >
>> >> >Set lobjCommand = New ADODB.Command
>> >> >With lobjCommand
>> >> > '//Inicializa comando
>> >> > .CommandTimeout = 60
>> >> > .CommandType = adCmdStoredProc
>> >> > .ActiveConnection = DBSeguridad
>> >> >
>> >> > '//Ejecuta comando
>> >> > .CommandText = "_Pruebas"
>> >> > .Execute
>> >> >End With
>> >> >
>> >> >Set lobjCommand = Nothing
>> >> >
>> >> >ErrorHandler:
>> >> > MsgBox (Err.Description)
>> >> > Set lobjCommand = Nothing
>> >> >End Sub
>> >> >
>> >> >Una recomendacion es que en tus procedimientos
>> >> almacenados siempre uses SET
>> >> >NOCOUNT ON como primera linea del cuerpo, de lo
>> contrario
>> >> tendras que usar
>> >> >Recordset.NextRecorset para capturar los distintos
>> >> recordsets generados por
>> >> >el procedimiento producto del mensaje ((xxx row(s)
>> >> affected)) de filas
>> >> >afectadas que envia sql server por cada statement
>> >> select / insert / update /
>> >> >delete hacia la alicacion cliente y los cuales
deben
>> >> manipularse o cerrarse
>> >> >(los recordsets) antes de tener acceso al valor de
>> >> retorno o a los valores de
>> >> >los parametros de salido del procedimiento.
>> >> >
>> >> >
>> >> >AMB
>> >> >
>> >> >
>> >> >"Gustavo" wrote:
>> >> >
>> >> >> Hola Muchachos:
>> >> >>
>> >> >> Tengo el problema de que en una aplicacion VB6 no
me
>> >> >> captura los errores "fabricados" con RAISEERROR
en
>> >> Stores
>> >> >> Procedures de SQL Server que invoco desde VB6
>> >> utilizando
>> >> >> el objeto ADODB.Command
>> >> >>
>> >> >> El tema es que invoco el objetoCommand.Execute,
>> ejecuta
>> >> el
>> >> >> stored procedure pero -a pesar de tener la
seguridad
>> de
>> >> >> que el RAISEERROR fue invocado- no me devuelve
nada
>> en
>> >> la
>> >> >> coleccion del objeto VB6->Err ni tampoco en la
>> >> coleccion
>> >> >> objetoCommand.Activeconnection.Errors
>> >> >>
>> >> >> Les mado un ejemplito:
>> >> >>
>> >> >> VB6
>> >> >>
>> >> >> Private Sub Command1_Click()
>> >> >> On Error Resume Next
>> >> >> Dim lobjCommand As ADODB.Command
>> >> >> Set lobjCommand = New ADODB.Command
>> >> >> With lobjCommand
>> >> >> '//Inicializa comando
>> >> >> .CommandTimeout = 60
>> >> >> .CommandType = adCmdStoredProc
>> >> >> .ActiveConnection = DBSeguridad
>> >> >>
>> >> >> '//Ejecuta comando
>> >> >> .CommandText = "_Pruebas"
>> >> >> .Execute
>> >> >> End With
>> >> >> Set lobjCommand = Nothing
>> >> >> End Sub
>> >> >>
>> >> >> SQL SERVER
>> >> >>
>> >> >> (En este ejemplo se va por el RAISEERROR / RETURN
en
>> el
>> >> >> segundo INSERT ya que la longitud del campo que
se
>> >> >> pretende insertar es mayor a la definida en la
>> tabla -
>> >> NO
>> >> >> ME CAPTURA EL ERROR EN VISUAL!!!)
>> >> >>
>> >> >> CREATE PROCEDURE _Pruebas
>> >> >> AS
>> >> >> DECLARE @myerror int
>> >> >> DECLARE @mydescerror varchar(100)
>> >> >> INSERT INTO _Test (Test) VALUES ('Texto Uno')
>> >> >> SET @myerror = @@ERROR
>> >> >> IF @myerror <> 0
>> >> >> Begin
>> >> >> SET @mydescerror = 'Se produjo el error: ' +
>> >> convert
>> >> >> (varchar,@myerror) + ' en la instrucciàffà,³n:
>> INSERT
>> >> INTO
>> >> >> _Test'
>> >> >> RAISERROR (@mydescerror, 16, 1)
>> >> >> Return 4000
>> >> >> end
longitud
>> del
>> >> campo
>> >> >> que se pretende insertar es mayor a la definida
en
>> la
>> >> tabla
>> >> >> INSERT INTO _Test (Test) VALUES ('Texto Dos
>> >> >> SDFSDFSDFSDFSDFS')
>> >> >> SET @myerror = @@ERROR
>> >> >> IF @myerror <> 0
>> >> >> Begin
>> >> >> SET @mydescerror = 'Se produjo el error: ' +
>> >> convert
>> >> >> (varchar,@myerror) + ' en la instrucciàffà,³n:
>> INSERT
>> >> INTO
>> >> >> _Test'
>> >> >> RAISERROR (@mydescerror, 16, 1)
>> >> >> Return 4000
>> >> >> end
>> >> >> INSERT INTO _Test (Test) VALUES ('Texto Tres')
>> >> >> SET @myerror = @@ERROR
>> >> >> IF @myerror <> 0
>> >> >> Begin
>> >> >> SET @mydescerror = 'Se produjo el error: ' +
>> >> convert
>> >> >> (varchar,@myerror) + ' en la instrucciàffà,³n:
>> INSERT
>> >> INTO
>> >> >> _Test'
>> >> >> RAISERROR (@mydescerror, 16, 1)
>> >> >> Return 4000
>> >> >> end
>> >> >>
>> >> >> Gracias!!
>> >> >> Gustavo.
>> >> >>
>> >> >.
>> >> >
>> >>
>> >.
>> >
>>
>.
>

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