Saltar al contenido

¿Cómo detectar un error de SqlException específico?

Solución:

La SqlException tiene una propiedad Number que puede verificar. Para error duplicado, el número es 2601.

catch (SqlException e)
{
   switch (e.Number)
   {
      case 2601:
         // Do something.
         break;
      default:
         throw;
   }
 }

Para obtener una lista de todos los errores SQL de su servidor, intente esto:

 SELECT * FROM sysmessages

Actualizar

Esto ahora se puede simplificar en C # 6.0

catch (SqlException e) when (e.Number == 2601)
{
   // Do something.
}

Más o menos, más o menos. Ver causa y resolución de errores del motor de base de datos

class SqllErrorNumbers
{ 
   public const int BadObject = 208;
   public const int DupKey = 2627;
}

try
{
   ...
}
catch(SqlException sex)
{
   foreach(SqlErrorCode err in sex.Errors)
   {
      switch (err.Number)
      {
      case SqlErrorNumber.BadObject:...
      case SqllErrorNumbers.DupKey: ...
      }
   }
}

Sin embargo, el problema es que una buena capa DAL nos TRY/CATCH dentro el T-SQL (procedimientos almacenados), con un patrón como manejo de excepciones y transacciones anidadas. Por desgracia un T-SQL TRY/CATCH El bloque no puede generar el código de error original, tendrá que generar un nuevo error, con código superior a 50000. Esto hace que el manejo del lado del cliente sea un problema. En la próxima versión de SQL Server hay una nueva construcción THROW que permite volver a generar la excepción original de los bloques catch de T-SQL.

Es mejor usar códigos de error, no tiene que analizar.

try
{
}
catch (SqlException exception)
{
    if (exception.Number == 208)
    {

    }
    else
        throw;
}

Cómo saber que debe usarse 208:

select message_id
from sys.messages
where text like 'Invalid object name%'
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *