Atrapar Error de SQL Server

07/07/2004 - 10:32 por Serafin Salazar | Informe spam
Hola, tengo un procedimiento que elimina registros de una tabla. Esta tabla
es referenciada por otras, lo que desea es que si se esta violando alguna
regla de integridad referencial como foreign key, el procedimiento me
devuelva el codigo de error, de tal manera que en una pagina asp pueda, de
acuerdo al error retornado, mostrar un mensaje amigable al usuario.
Lo que tengo es lo siguiente:


create proc proc_Delete
as
begin
set nocount on
declare @mierror integer
select @mierror=0
begin tran a
delete from caf_warnings_state where ws_key2
set @mierror=@@error
if @mierror<>0
begin
rollback tran a
goto salir
end
commit tran a
salir:
return (@mierror)
end

y lo estoy invocando asi:

declare @salida int
exec @salida =proc_Delete
select @salida

pero no me devuelve unicamente el codigo de error, y obtengo problemas desde
la pagina con todo ese texto extra...alguna ayuda por favor.

Mil gracias!

Preguntas similare

Leer las respuestas

#1 Serafin Salazar
07/07/2004 - 14:31 | Informe spam
Hola Javier, si estoy usando ADO desde ASP. Pero me genera un error al
tratar de Ejecutar el procedimiento almacenado de esta forma:


sql=" declare @salida int" & _ " exec @salida =proc_Delete" & _ " select
@salida " set rs=conn.execute(sql) response.Write rs(0)

Ni siquiera ejecuta el sql, me muestra el mismo error de llave foranea

Microsoft OLE DB Provider for SQL Server (0x80040E2F)
Instrucción DELETE en conflicto con la restricción COLUMN REFERENCE
'fkprueba'. El conflicto ha aparecido en la base de datos 'DEV02BVS', tabla
'caf_warnings_stage', column 'wst_ws_key'.
/dev02bvs/pruebapalm.asp, line 37



"Javier Loria" escribió en el mensaje
news:%
Hola:
Asumo que en la pagina asp estas usando ADO, si es asi en el objeto
conexion existe una coleccion errors, debes buscar en esta coleccion el
error. El objeto error tiene un numero NativeError que es el numero de


error
de SQL.
Personalmente prefiero personalizar los mensajes en la aplicacion


(como
estas haciendo), pero tambien es posible personalizarlo en SQL. Para esto
puedes hacer un RAISERROR.
=> IF EXIST (SELECT *
FROM TablaReferenciada
WHERE Columna=@Valor)
BEGIN
RAISERROR('El codigo %s, se esta usando en X ',
16, 1, @Valor)
END
=> Saludos,


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.

Serafin Salazar escribio:
> Hola, tengo un procedimiento que elimina registros de una tabla. Esta
> tabla es referenciada por otras, lo que desea es que si se esta
> violando alguna regla de integridad referencial como foreign key, el
> procedimiento me devuelva el codigo de error, de tal manera que en
> una pagina asp pueda, de acuerdo al error retornado, mostrar un
> mensaje amigable al usuario.
> Lo que tengo es lo siguiente:
>
>
> create proc proc_Delete
> as
> begin
> set nocount on
> declare @mierror integer
> select @mierror=0
> begin tran a
> delete from caf_warnings_state where ws_key2
> set @mierror=@@error
> if @mierror<>0
> begin
> rollback tran a
> goto salir
> end
> commit tran a
> salir:
> return (@mierror)
> end
>
> y lo estoy invocando asi:
>
> declare @salida int
> exec @salida =proc_Delete
> select @salida
>
> pero no me devuelve unicamente el codigo de error, y obtengo
> problemas desde la pagina con todo ese texto extra...alguna ayuda por
> favor.
>
> Mil gracias!


Respuesta Responder a este mensaje
#2 Serafin Salazar
07/07/2004 - 15:20 | Informe spam
el asusnto es que ASP no es posible usar On error goto to...
"Javier Loria" escribió en el mensaje
news:%23$
Hola Serafin:
Puedes revisar el objeto command para usar parametros en ADO debes


usar
el objeto command.
En todo caso, deberia verse asi:
==>
On Error Goto ErrorBD
SET rs=Conn.Execute()
Response.Write rs(0)
Exit Sub
:ErrorDB
Dim E
For Each E In Conn.Errors
Response.Write E.NativeError
Respones.Write E.Description
Next
Exit Sub
==> Es posible que tenga erroes de sintaxis porque estoy un poco


herrumbrado
con VB y ASP, pero espero darte una idea.
Saludos,


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.
Serafin Salazar escribio:
> Hola Javier, si estoy usando ADO desde ASP. Pero me genera un error al
> tratar de Ejecutar el procedimiento almacenado de esta forma:
>
>
> sql=" declare @salida int" & _ " exec @salida =proc_Delete" & _ "
> select @salida " set rs=conn.execute(sql) response.Write rs(0)
>
> Ni siquiera ejecuta el sql, me muestra el mismo error de llave foranea
>
> Microsoft OLE DB Provider for SQL Server (0x80040E2F)
> Instrucción DELETE en conflicto con la restricción COLUMN REFERENCE
> 'fkprueba'. El conflicto ha aparecido en la base de datos 'DEV02BVS',
> tabla 'caf_warnings_stage', column 'wst_ws_key'.
> /dev02bvs/pruebapalm.asp, line 37
>
>
>
> "Javier Loria" escribió en el mensaje
> news:%
>> Hola:
>> Asumo que en la pagina asp estas usando ADO, si es asi en el
>> objeto conexion existe una coleccion errors, debes buscar en esta
>> coleccion el error. El objeto error tiene un numero NativeError que
>> es el numero de error de SQL.
>> Personalmente prefiero personalizar los mensajes en la
>> aplicacion (como estas haciendo), pero tambien es posible
>> personalizarlo en SQL. Para esto puedes hacer un RAISERROR.
>> => >> IF EXIST (SELECT *
>> FROM TablaReferenciada
>> WHERE Columna=@Valor)
>> BEGIN
>> RAISERROR('El codigo %s, se esta usando en X ',
>> 16, 1, @Valor)
>> END
>> => >> Saludos,
>>
>>
>> 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.
>>
>> Serafin Salazar escribio:
>>> Hola, tengo un procedimiento que elimina registros de una tabla.
>>> Esta tabla es referenciada por otras, lo que desea es que si se esta
>>> violando alguna regla de integridad referencial como foreign key, el
>>> procedimiento me devuelva el codigo de error, de tal manera que en
>>> una pagina asp pueda, de acuerdo al error retornado, mostrar un
>>> mensaje amigable al usuario.
>>> Lo que tengo es lo siguiente:
>>>
>>>
>>> create proc proc_Delete
>>> as
>>> begin
>>> set nocount on
>>> declare @mierror integer
>>> select @mierror=0
>>> begin tran a
>>> delete from caf_warnings_state where ws_key2
>>> set @mierror=@@error
>>> if @mierror<>0
>>> begin
>>> rollback tran a
>>> goto salir
>>> end
>>> commit tran a
>>> salir:
>>> return (@mierror)
>>> end
>>>
>>> y lo estoy invocando asi:
>>>
>>> declare @salida int
>>> exec @salida =proc_Delete
>>> select @salida
>>>
>>> pero no me devuelve unicamente el codigo de error, y obtengo
>>> problemas desde la pagina con todo ese texto extra...alguna ayuda
>>> por favor.
>>>
>>> Mil gracias!


Respuesta Responder a este mensaje
#3 Javier Loria
07/07/2004 - 19:21 | Informe spam
Hola:
Asumo que en la pagina asp estas usando ADO, si es asi en el objeto
conexion existe una coleccion errors, debes buscar en esta coleccion el
error. El objeto error tiene un numero NativeError que es el numero de error
de SQL.
Personalmente prefiero personalizar los mensajes en la aplicacion (como
estas haciendo), pero tambien es posible personalizarlo en SQL. Para esto
puedes hacer un RAISERROR.
= IF EXIST (SELECT *
FROM TablaReferenciada
WHERE Columna=@Valor)
BEGIN
RAISERROR('El codigo %s, se esta usando en X ',
16, 1, @Valor)
END
= Saludos,


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.

Serafin Salazar escribio:
Hola, tengo un procedimiento que elimina registros de una tabla. Esta
tabla es referenciada por otras, lo que desea es que si se esta
violando alguna regla de integridad referencial como foreign key, el
procedimiento me devuelva el codigo de error, de tal manera que en
una pagina asp pueda, de acuerdo al error retornado, mostrar un
mensaje amigable al usuario.
Lo que tengo es lo siguiente:


create proc proc_Delete
as
begin
set nocount on
declare @mierror integer
select @mierror=0
begin tran a
delete from caf_warnings_state where ws_key2
set @mierror=@@error
if @mierror<>0
begin
rollback tran a
goto salir
end
commit tran a
salir:
return (@mierror)
end

y lo estoy invocando asi:

declare @salida int
exec @salida =proc_Delete
select @salida

pero no me devuelve unicamente el codigo de error, y obtengo
problemas desde la pagina con todo ese texto extra...alguna ayuda por
favor.

Mil gracias!
Respuesta Responder a este mensaje
#4 Javier Loria
07/07/2004 - 21:58 | Informe spam
Hola Serafin:
Puedes revisar el objeto command para usar parametros en ADO debes usar
el objeto command.
En todo caso, deberia verse asi:
==
On Error Goto ErrorBD
SET rs=Conn.Execute()
Response.Write rs(0)
Exit Sub
:ErrorDB
Dim E
For Each E In Conn.Errors
Response.Write E.NativeError
Respones.Write E.Description
Next
Exit Sub
== Es posible que tenga erroes de sintaxis porque estoy un poco herrumbrado
con VB y ASP, pero espero darte una idea.
Saludos,


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.
Serafin Salazar escribio:
Hola Javier, si estoy usando ADO desde ASP. Pero me genera un error al
tratar de Ejecutar el procedimiento almacenado de esta forma:


sql=" declare @salida int" & _ " exec @salida =proc_Delete" & _ "
select @salida " set rs=conn.execute(sql) response.Write rs(0)

Ni siquiera ejecuta el sql, me muestra el mismo error de llave foranea

Microsoft OLE DB Provider for SQL Server (0x80040E2F)
Instrucción DELETE en conflicto con la restricción COLUMN REFERENCE
'fkprueba'. El conflicto ha aparecido en la base de datos 'DEV02BVS',
tabla 'caf_warnings_stage', column 'wst_ws_key'.
/dev02bvs/pruebapalm.asp, line 37



"Javier Loria" escribió en el mensaje
news:%
Hola:
Asumo que en la pagina asp estas usando ADO, si es asi en el
objeto conexion existe una coleccion errors, debes buscar en esta
coleccion el error. El objeto error tiene un numero NativeError que
es el numero de error de SQL.
Personalmente prefiero personalizar los mensajes en la
aplicacion (como estas haciendo), pero tambien es posible
personalizarlo en SQL. Para esto puedes hacer un RAISERROR.
=>> IF EXIST (SELECT *
FROM TablaReferenciada
WHERE Columna=@Valor)
BEGIN
RAISERROR('El codigo %s, se esta usando en X ',
16, 1, @Valor)
END
=>> Saludos,


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.

Serafin Salazar escribio:
Hola, tengo un procedimiento que elimina registros de una tabla.
Esta tabla es referenciada por otras, lo que desea es que si se esta
violando alguna regla de integridad referencial como foreign key, el
procedimiento me devuelva el codigo de error, de tal manera que en
una pagina asp pueda, de acuerdo al error retornado, mostrar un
mensaje amigable al usuario.
Lo que tengo es lo siguiente:


create proc proc_Delete
as
begin
set nocount on
declare @mierror integer
select @mierror=0
begin tran a
delete from caf_warnings_state where ws_key2
set @mierror=@@error
if @mierror<>0
begin
rollback tran a
goto salir
end
commit tran a
salir:
return (@mierror)
end

y lo estoy invocando asi:

declare @salida int
exec @salida =proc_Delete
select @salida

pero no me devuelve unicamente el codigo de error, y obtengo
problemas desde la pagina con todo ese texto extra...alguna ayuda
por favor.

Mil gracias!
Respuesta Responder a este mensaje
#5 Serafin Salazar
08/07/2004 - 09:52 | Informe spam
si.
"Javier Loria" escribió en el mensaje
news:
Hola:
Estas totalmente seguro???
Ya estoy un poco herrumbrado con ASP pero creo que si lo soporta.
Saludos,


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.

Serafin Salazar escribio:
> el asusnto es que ASP no es posible usar On error goto to...
> "Javier Loria" escribió en el mensaje
> news:%23$
>> Hola Serafin:
>> Puedes revisar el objeto command para usar parametros en ADO
>> debes usar el objeto command.
>> En todo caso, deberia verse asi:
>> ==> >>
>> On Error Goto ErrorBD
>> SET rs=Conn.Execute()
>> Response.Write rs(0)
>> Exit Sub
>>> ErrorDB
>> Dim E
>> For Each E In Conn.Errors
>> Response.Write E.NativeError
>> Respones.Write E.Description
>> Next
>> Exit Sub
>> ==> >> Es posible que tenga erroes de sintaxis porque estoy un poco
>> herrumbrado con VB y ASP, pero espero darte una idea.
>> Saludos,
>>
>>
>> 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.
>> Serafin Salazar escribio:
>>> Hola Javier, si estoy usando ADO desde ASP. Pero me genera un error
>>> al tratar de Ejecutar el procedimiento almacenado de esta forma:
>>>
>>>
>>> sql=" declare @salida int" & _ " exec @salida =proc_Delete" & _ "
>>> select @salida " set rs=conn.execute(sql) response.Write rs(0)
>>>
>>> Ni siquiera ejecuta el sql, me muestra el mismo error de llave
>>> foranea
>>>
>>> Microsoft OLE DB Provider for SQL Server (0x80040E2F)
>>> Instrucción DELETE en conflicto con la restricción COLUMN REFERENCE
>>> 'fkprueba'. El conflicto ha aparecido en la base de datos
>>> 'DEV02BVS', tabla 'caf_warnings_stage', column 'wst_ws_key'.
>>> /dev02bvs/pruebapalm.asp, line 37
>>>
>>>
>>>
>>> "Javier Loria" escribió en el mensaje
>>> news:%
>>>> Hola:
>>>> Asumo que en la pagina asp estas usando ADO, si es asi en el
>>>> objeto conexion existe una coleccion errors, debes buscar en esta
>>>> coleccion el error. El objeto error tiene un numero NativeError que
>>>> es el numero de error de SQL.
>>>> Personalmente prefiero personalizar los mensajes en la
>>>> aplicacion (como estas haciendo), pero tambien es posible
>>>> personalizarlo en SQL. Para esto puedes hacer un RAISERROR.
>>>> => >>>> IF EXIST (SELECT *
>>>> FROM TablaReferenciada
>>>> WHERE Columna=@Valor)
>>>> BEGIN
>>>> RAISERROR('El codigo %s, se esta usando en X ',
>>>> 16, 1, @Valor)
>>>> END
>>>> => >>>> Saludos,
>>>>
>>>>
>>>> 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.
>>>>
>>>> Serafin Salazar escribio:
>>>>> Hola, tengo un procedimiento que elimina registros de una tabla.
>>>>> Esta tabla es referenciada por otras, lo que desea es que si se
>>>>> esta violando alguna regla de integridad referencial como foreign
>>>>> key, el procedimiento me devuelva el codigo de error, de tal
>>>>> manera que en una pagina asp pueda, de acuerdo al error
>>>>> retornado, mostrar un mensaje amigable al usuario.
>>>>> Lo que tengo es lo siguiente:
>>>>>
>>>>>
>>>>> create proc proc_Delete
>>>>> as
>>>>> begin
>>>>> set nocount on
>>>>> declare @mierror integer
>>>>> select @mierror=0
>>>>> begin tran a
>>>>> delete from caf_warnings_state where ws_key2
>>>>> set @mierror=@@error
>>>>> if @mierror<>0
>>>>> begin
>>>>> rollback tran a
>>>>> goto salir
>>>>> end
>>>>> commit tran a
>>>>> salir:
>>>>> return (@mierror)
>>>>> end
>>>>>
>>>>> y lo estoy invocando asi:
>>>>>
>>>>> declare @salida int
>>>>> exec @salida =proc_Delete
>>>>> select @salida
>>>>>
>>>>> pero no me devuelve unicamente el codigo de error, y obtengo
>>>>> problemas desde la pagina con todo ese texto extra...alguna ayuda
>>>>> por favor.
>>>>>
>>>>> Mil gracias!


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida