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

Preguntas similare

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



Respuesta Responder a este mensaje
#2 GOM
07/12/2004 - 01:05 | Informe spam
David, el @@error no resultara ya que no esta ocurriendo ningun error, ya
que esta verificando una validacion que es normal pero en ningun momento hay
error de programacion o de validacion de datos. cuando haces el rollback
deverias de generar el codigo para capturar el erro en VB con return

"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



Respuesta Responder a este mensaje
#3 David Clink
07/12/2004 - 13:55 | Informe spam
GRACIAS GOM.
Fijate que esta tabla tiene un trigger quien es la que se encarga de generar
el error, por cuestiones de espacio no incluí el código del trigger, pero lo
que hace es bantante sencillo, verifica un campo, si ese no cumple cierta
condición genero el error personalizado (RAISERROR(50005,16,1))
Este error lo puedo capturar con @@ERROR dentro del procedimiento
almacenado, pero no así en el cliente, porque aparece como que todo se
hubiera ejecutado bien.

Si pongo una variable OUTPUT y la seteo al error, si puedo obtener el error
de la colección error de la conexión

@_Resultado as int OUTPUT declaración de la variable

la seteo mas adelante

SET @_Resultado = @@ERROR

De este modo si puedo obtener el valor del error del lado del cliente. Y no
entiendo que tiene que ver la variable OUTPUT, porque si la quito ya no
obtengo el error del lado del cliente.



"GOM" escribió en el mensaje
news:O3igzE$
David, el @@error no resultara ya que no esta ocurriendo ningun error, ya
que esta verificando una validacion que es normal pero en ningun momento
hay
error de programacion o de validacion de datos. cuando haces el rollback
deverias de generar el codigo para capturar el erro en VB con return

"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







Respuesta Responder a este mensaje
#4 David Clink
07/12/2004 - 14:06 | Informe spam
Por cierto MAXI, devolver el error o algun código me soluciona el problema,
porque yo puedo detectar el valor de retorno del lado del cliente, el punto
es que el error no me lo devuelve en la colección errors de la conexión, y
la verdad me gustaría saber que estoy haciendo mal o que tengo que hacer o
si cuando es personalizado esto no es posible.

Gracias.


"MAXI" escribió en el mensaje
news:eRhO2l%
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







Respuesta Responder a este mensaje
#5 Javier Loria
07/12/2004 - 15:26 | Informe spam
Hola:
Puedes probar el siguiente codigo:
==USE NORTHWIND
GO
CREATE TRIGGER UpdCustomersTr
ON Customers INSTEAD OF UPDATE
AS
BEGIN
RAISERROR ('No se pueden actualizar clientes', 16,1)
ROLLBACK
END
GO

CREATE PROCEDURE UpdCustomersAddr
(@CustomerID nchar(5),
@Address nvarchar(60),
@City nvarchar(15),
@Region nvarchar(15),
@PostalCode nvarchar(10),
@Country nvarchar(15))
AS
UPDATE Customers
SET Address = @Address
, City = @City
, Region = @Region
, PostalCode = PostalCode,
Country = Country
WHERE CustomerID = @CustomerID
GO
== Asumo que estas usando VB 6.0, prueba con:
==Public Sub Test()
On Error GoTo ErrHnd

Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command

cmd.CommandType = adCmdStoredProc
cmd.CommandText = "UpdCustomersAddr"

cn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Data
Source=.;Initial Catalog=Northwind"
cn.Open
cmd.ActiveConnection = cn

' No es Eficiente, es FACIL
cmd.Parameters.Refresh

cmd.Parameters("@CustomerID").Value = "ALFKI"
cmd.Parameters("@Address").Value = "Apdo 111111"
cmd.Parameters("@City").Value = "San Jose"
cmd.Parameters("@Region").Value = "San Jose"
cmd.Parameters("@PostalCode").Value = "1000"
cmd.Parameters("@Country").Value = "Costa Rica"
cmd.Execute

' EXEC UpdCustomersAddr 'ALFKI', 'Apdo 111111', 'San Jose', 'San Jose',
'1000', 'Costa Rica'


cn.Close
Exit Sub
ErrHnd:
Dim Err As ADODB.Error
For Each Err In cn.Errors
MsgBox Err.Description
Next Err

End Sub
== Espero te sirva,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"David Clink" wrote in message
news:#nymgN#
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



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