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

#11 Gustavo
04/04/2005 - 21:03 | Informe spam
Gracias Alejandro. Con tu ejemplo anda fenomeno. Pero lo
que sucede ahora es que quiero usar el objeto command de
VB6 para invocar al Store Procedure y en la propiedad
ActiveConnection no me devuelve la colleccion de errores
que sí devuelve cuando se usa el objeto conexion directo
como lo haces en tu ejemplo. Es necesario que pueda seguir
usando el objeto command vinculado al conexion y no el obj
conexion directamente por el tema de como tengo armado el
aplicativo con commands por todos lados y parametros para
cada uno de ellos. Conoces algun seteo del objeto
adodb.command de visual para que me devuelva la coleccion
de errores como si lo hicieras desde el obj colleccion
directamente ?

Un Abrazo,
Gustavo.

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



del test
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;inte


grated
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:





a
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àffà,­ 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àfffàf,à,³n:
>> INSERT
>> >> INTO
>> >> >> _Test'
>> >> >> RAISERROR (@mydescerror, 16, 1)
>> >> >> Return 4000
>> >> >> end




la
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àfffà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àfffàf,à,³n:
>> INSERT
>> >> INTO
>> >> >> _Test'
>> >> >> RAISERROR (@mydescerror, 16, 1)
>> >> >> Return 4000
>> >> >> end
>> >> >>
>> >> >> Gracias!!
>> >> >> Gustavo.
>> >> >>
>> >> >.
>> >> >
>> >>
>> >.
>> >
>>
>.
>



.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida