Problema al generar error personalizado

06/12/2004 - 23:23 por David Clink | Informe spam
He generado un error personalizado y hago que si dispare al hacer una
validación dentro de un trigger.
Los pasos son los siguientes:

1. Se ejecuta un procedimiento almacenado que actualiza una tabla.
2. Dentro de un trigger se verifica ciertas condiciones antes de completar
la actualización.
2. Si no se cumplen las condiciones, se genera un error personalizado.
(RAISERROR)
3. Despues de la sentencia UPDATE verifico si se ejecuto algun error
@@ERROR, ( podría haberse generado el error del paso anterior si o se
cumplieron todas las condiciones) si es asi deshago la actualización con un
ROLLBACK osino la confirmo con un COMMIT

Básicamente esto es lo que hace el procedimiento, pero me ha sucedido que
cuando verifico el fallo en el cliente (En el cliente verifico si hay
errores conla colección Errors de la conexión) no obtengo ninguno a menos
que declare una variable de tipo OUTPUT. La verdad tengo alternativas para
hacer esto mismo, pero mi interes es entender como trabaja SQL esta parte.

IMPORTANTE:
Si estoy equivocado en algo o tiene una mejor forma de controlar los errores
me gustaría mucho me ayudarán.

De ante mano gracias.

|***********************************************************************************************************************|
NOTA:
Si intento insertar valores duplicados en un campo que es llave primaria se
me genera el error y yo lo controlo del lado del cliente sin tener que tener
una variable output. Con solo verificar la colección ERRORS de la conexión
puedo saber que sucedio, no así con los errores personalizados.
|***********************************************************************************************************************|

Anexo el código del procedimiento almacenado para que tengan una mejor idea.

CREATE PROCEDURE PR_MP_IUD_Familia_Materiales
@Codi_Familia as char(1),
@Descripcion as varchar(100),
@TipoMateDelGrupo as int,
@AsigConsumo as bit,
@Asignable as bit,
@_Codi_Familia as char(1),
@_Resultado as int OUTPUT /*SI QUITO ESTA VARIABLE EL PROCEDIMIENTO YA NO
ME DEVUELVE EL FALLO*/

AS

BEGIN TRANSACTION

UPDATE TB_Familia
SET Codi_Familia = @Codi_Familia, Descripcion =
@Descripcion, TipoMateDelGrupo = @TipoMateDelGrupo, AsigConsumo =
@AsigConsumo, Asignable = @Asignable
WHERE Codi_Familia = @_Codi_Familia

SET @_Resultado = @@ERROR /**** AL QUITAR ESTO YA NO OBTENGO EL
FALLO DEL LADO DEL CLIENTE*********/

IF @_Resultado <> 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

GO
 

Leer las respuestas

#1 MAXI
07/12/2004 - 00:15 | Informe spam
Hola amigo, prueba poniendo return 99 cuando da el error y cuentame como te
va ;)




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messenger:

"David Clink" escribió en el mensaje
news:%23nymgN%
He generado un error personalizado y hago que si dispare al hacer una
validación dentro de un trigger.
Los pasos son los siguientes:

1. Se ejecuta un procedimiento almacenado que actualiza una tabla.
2. Dentro de un trigger se verifica ciertas condiciones antes de completar
la actualización.
2. Si no se cumplen las condiciones, se genera un error personalizado.
(RAISERROR)
3. Despues de la sentencia UPDATE verifico si se ejecuto algun error
@@ERROR, ( podría haberse generado el error del paso anterior si o se
cumplieron todas las condiciones) si es asi deshago la actualización con
un ROLLBACK osino la confirmo con un COMMIT

Básicamente esto es lo que hace el procedimiento, pero me ha sucedido que
cuando verifico el fallo en el cliente (En el cliente verifico si hay
errores conla colección Errors de la conexión) no obtengo ninguno a menos
que declare una variable de tipo OUTPUT. La verdad tengo alternativas
para hacer esto mismo, pero mi interes es entender como trabaja SQL esta
parte.

IMPORTANTE:
Si estoy equivocado en algo o tiene una mejor forma de controlar los
errores me gustaría mucho me ayudarán.

De ante mano gracias.

|***********************************************************************************************************************|
NOTA:
Si intento insertar valores duplicados en un campo que es llave primaria
se me genera el error y yo lo controlo del lado del cliente sin tener que
tener una variable output. Con solo verificar la colección ERRORS de la
conexión puedo saber que sucedio, no así con los errores personalizados.
|***********************************************************************************************************************|

Anexo el código del procedimiento almacenado para que tengan una mejor
idea.

CREATE PROCEDURE PR_MP_IUD_Familia_Materiales
@Codi_Familia as char(1),
@Descripcion as varchar(100),
@TipoMateDelGrupo as int,
@AsigConsumo as bit,
@Asignable as bit,
@_Codi_Familia as char(1),
@_Resultado as int OUTPUT /*SI QUITO ESTA VARIABLE EL PROCEDIMIENTO YA
NO ME DEVUELVE EL FALLO*/

AS

BEGIN TRANSACTION

UPDATE TB_Familia
SET Codi_Familia = @Codi_Familia, Descripcion =
@Descripcion, TipoMateDelGrupo = @TipoMateDelGrupo, AsigConsumo =
@AsigConsumo, Asignable = @Asignable
WHERE Codi_Familia = @_Codi_Familia

SET @_Resultado = @@ERROR /**** AL QUITAR ESTO YA NO OBTENGO EL
FALLO DEL LADO DEL CLIENTE*********/

IF @_Resultado <> 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

GO



Preguntas similares