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.

Mostrar la cita
adParamReturnValue a
Mostrar la cita
4000 si en realidad
Mostrar la cita
opcion WITH NOWAIT
Mostrar la cita
procedimiento para
Mostrar la cita
DEBBUG
Mostrar la cita
todas
Mostrar la cita
contrario
Mostrar la cita
ejecuta
Mostrar la cita
de
Mostrar la cita
en
Mostrar la cita
el
Mostrar la cita
tabla -
Mostrar la cita
INSERT
Mostrar la cita
del
Mostrar la cita
la
Mostrar la cita
INSERT
Mostrar la cita
INSERT
Mostrar la cita
#7 Alejandro Mesa
04/04/2005 - 15:37 | Informe spam
Gustavo,

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


AMB

"" wrote:

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

Mostrar la cita
el
Mostrar la cita
es
Mostrar la cita
pediste
Mostrar la cita
la
Mostrar la cita
de
Mostrar la cita
on
Mostrar la cita
los
Mostrar la cita
deben
Mostrar la cita
me
Mostrar la cita
en
Mostrar la cita
seguridad
Mostrar la cita
nada
Mostrar la cita
en
Mostrar la cita
se
Mostrar la cita
longitud
Mostrar la cita
en
Mostrar la cita
#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 ?

Mostrar la cita
el
Mostrar la cita
es
Mostrar la cita
pediste
Mostrar la cita
la
Mostrar la cita
de
Mostrar la cita
on
Mostrar la cita
los
Mostrar la cita
deben
Mostrar la cita
me
Mostrar la cita
en
Mostrar la cita
seguridad
Mostrar la cita
nada
Mostrar la cita
en
Mostrar la cita
se
Mostrar la cita
longitud
Mostrar la cita
en
Mostrar la cita
#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.

Mostrar la cita
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:

Mostrar la cita
Ads by Google
Search Busqueda sugerida