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%'