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:

Mostrar la cita
#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.

Mostrar la cita
capturar el error.
Mostrar la cita
almacenados siempre uses SET
Mostrar la cita
tendras que usar
Mostrar la cita
recordsets generados por
Mostrar la cita
affected)) de filas
Mostrar la cita
select / insert / update /
Mostrar la cita
manipularse o cerrarse
Mostrar la cita
retorno o a los valores de
Mostrar la cita
Stores
Mostrar la cita
utilizando
Mostrar la cita
el
Mostrar la cita
la
Mostrar la cita
coleccion
Mostrar la cita
NO
Mostrar la cita
convert
Mostrar la cita
INTO
Mostrar la cita
campo
Mostrar la cita
tabla
Mostrar la cita
convert
Mostrar la cita
INTO
Mostrar la cita
convert
Mostrar la cita
INTO
Mostrar la cita
#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.
#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:

Mostrar la cita
#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.

Mostrar la cita
siguiente:
Mostrar la cita
en el mensaje
Mostrar la cita
tabla
Mostrar la cita
Ads by Google
Search Busqueda sugerida