todas practices las handling excepciones example error create catch best c# sql-server raiserror

practices - throw exception c#



Catch error de aumento de SQL en C# (3)

Genero el error de aumento en el procedimiento SQL:

RAISERROR(''Already exist'',-10,-10)

pero no puedo atraparlo usando el siguiente código en C #

catch (SqlException ex) { bResult = false; if (ex.Errors[0].Number == -10) { CommonTools.vAddToLog("bInsertNewUser", "ManageUsers", ex.Message); if ((savePoint != null)) savePoint.Rollback(); } }

¿Cómo puedo detectar el error provocado en C #?


Los RAISERRORES con un valor de SEVERIDAD inferior o igual a 10 no se capturan en el lado C # porque supongo que se consideran solo advertencias, como se puede ver en la lista en Severidad de error del motor de base de datos

Los valores de SEVERITY entre 11 y 16 son errores que pueden ser corregidos por el usuario, así que, por ejemplo, puede probar con:

RAISERROR(''Already exist'',16,1)

De lo contrario, puede elegir otro código de error de la lista anterior o, si realmente lo necesita, preparar su propio mensaje de error personalizado usando sp_addmessage .


Tu sentencia if es donde las cosas fallan. Suponiendo que el primer error en la colección es de hecho el que está buscando (puede que no lo sea).

SqlError.Number no es el valor que estableció en RAISERROR .

Use SqlError.Class para recuperar la gravedad del error, o SqlError.State para verificar el estado (ambos son -10 en su ejemplo. Es tan difícil saber a qué se refiere):

catch (SqlException ex) { bResult = false; if (ex.Errors[0].Class == -10) { CommonTools.vAddToLog("bInsertNewUser", "ManageUsers", ex.Message); if ((savePoint != null)) savePoint.Rollback(); } }


Use un código de error dentro de 11-16, o simplemente use 16 para un caso "general".

RAISERROR(''Already exists'',16,1)

¿Por qué? Aquí está mi resumen de https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-error-severities?view=sql-server-2017 :

SQL RAISERROR -> C #:

  • 0-10 = fyi *
  • 11-16 = puedes arreglarlo **
  • 17-19 = obtener ayuda de administrador
  • 20-24 = definitivamente obtener ayuda de administrador ***

* (no tirar nada) ┬──┬

** (16 = general)

***(error fatal)