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

#1 Alejandro Mesa
01/04/2005 - 18:55 | Informe spam
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ó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.

Respuesta Responder a este mensaje
#2 Gustavo
01/04/2005 - 21:45 | Informe spam
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ón: INSERT




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




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ó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.



.

Respuesta Responder a este mensaje
#3 Maxi
01/04/2005 - 22:45 | Informe spam
Hola Gustavo, solo agrega en la creacion del Store lo siguiente:

create proc

SET NOCOUNT ON

loque sigue


pd: luego contame como te fue ;)


Salu2
Maxi


"Gustavo" escribió en el mensaje
news:176f01c536d5$95d64a30$
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.
Respuesta Responder a este mensaje
#4 Alejandro Mesa
01/04/2005 - 23:31 | Informe spam
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ón: INSERT
INTO
>> _Test'
>> RAISERROR (@mydescerror, 16, 1)
>> Return 4000
>> end
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ó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.
>>
>.
>

Respuesta Responder a este mensaje
#5 Gustavo
04/04/2005 - 15:06 | Informe spam
Gracias Maxi. Mejoró. Ahora captura el error, pero el
original que se sucedio en el Store Procedure y no el que
personalice con RAISEERROR. Quiero que capture el
personalizado. Me está faltando algo ?

Un Abrazo,
Gustavo.

Hola Gustavo, solo agrega en la creacion del Store lo


siguiente:

create proc

SET NOCOUNT ON

loque sigue


pd: luego contame como te fue ;)


Salu2
Maxi


"Gustavo" escribió


en el mensaje
news:176f01c536d5$95d64a30$
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.


.

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