Me preguntaba si alguien tenía una forma más elegante de comprobar excepciones únicas de clave de SQL en .NET además de analizar el mensaje de error. En este momento estoy llamando al sproc en SQL, luego usando un bloque try catch en .NET. En el bloque try catch, analizo el mensaje de error y se trata de un error de clave única. Lanzo una instancia de error personalizado a la clase de llamada, si no, simplemente tiro la excepción original a la clase de llamada. Esto me parece terriblemente ineficiente.Captura de excepciones de clave únicas de SQL en .NET
Respuesta
Si detecta una SqlException, debería ser capaz de enumerar la colección "Errores" que contiene un número de objetos "SqlError".
El SqlError tiene entre otras cosas propiedades como "Clase" y "Número" - las violaciones de clave únicas son clase = 14 y número = 2601. Verifique esos números para encontrar su error con precisión.
Esos son los mismos códigos de error que recibe cuando intenta ejecutar la consulta en SQL Server Management Studio:
Msg 2601, nivel 14, estado 1, línea 1
No se puede insertar una fila de clave duplicada en objeto ..........
La declaración ha finalizado.
El "Msg" se traduce en la propiedad "Número" en SqlError, el "Nivel" en "Clase".
try
{
_cmd.ExecuteNonQuery();
}
catch(SqlException sqlExc)
{
foreach (SqlError error in sqlExc.Errors)
{
string msg = string.Format("{0}: {1}", error.Number, error.Message);
}
}
De esta forma, puede identificar fácil y EXACTAMENTE un error de "restricción única violada".
Marc
Respuesta obvia: intente recuperar ese valor de la base de datos antes de insertarlo (o actualizarlo) y notificar al usuario antes de hacer la inserción.
Respuesta alternativa: verifique la exclusividad dentro del SP y devuelva eso como un mensaje de error del SP, entonces no tiene que analizar ningún error. Todos son malos.
¿Por qué no solo consulta si existe la identificación única? Es mejor que obtener una excepción.
+1 para evitar la excepción en primer lugar. El proceso almacenado debe verificar la existencia y devolver un resultado conocido si la clave ya existe, en cuyo caso puede manejar sin lanzar una excepción, que es mucho más eficiente. –
A menos que haga que su procedimiento almacenado sea serializable, ¿no se encontrará con problemas de concurrencia a medida que aumente el número de transacciones por segundo? En otras palabras, entre su comprobación de que la fila no existe y su inserción, otro usuario ya ha insertado la fila. Sin mencionar los gastos generales de hacer el cheque en primer lugar. En mi humilde opinión, es mucho mejor simplemente insertar y manejar el error de .NET. –
El mensaje de error de análisis es una mala idea. Por ejemplo, si está utilizando Ms SQL, el mensaje puede estar localizado (en otro idioma) y no encontrará la palabra que está buscando.
Si está utilizando MS SQL debe marcar la propiedad Number.
Lo que me molesta de esto es que SQL Server no distingue entre una violación de clave primaria y una violación de restricción única cuando se trata de códigos de error, ya que ambos devuelven 2627. Una violación de índice única devuelve 2601, pero la mayoría de las veces soy usando PK o UC.¿Alguna idea sobre cómo distinguir una violación de PK de una violación de UC de una manera segura para la localización? –
- 1. SQL Inserciones de clave únicas
- 2. Prevención de excepciones contra excepciones de captura en Java
- 3. Captura de excepciones en plantillas de django
- 4. Orden de captura de excepciones en Java
- 5. Excepciones de lanzamiento y captura
- 6. Manejo de Excepciones únicas de registro en un controlador
- 7. Captura de todas las excepciones en Python
- 8. Captura de excepciones controladas en C#
- 9. Captura de excepciones en el constructor
- 10. Clave de captura de JavaScript
- 11. Captura de excepciones de puntero nulo
- 12. Captura de excepciones lanzadas desde DLL
- 13. Java: la captura de excepciones específicas
- 14. SQL y combinaciones únicas de n-coulmn
- 15. La captura de números de línea en excepciones rubí
- 16. la gestión de excepciones intento de captura en el interior de captura
- 17. Excepciones en PHP - Prueba/captura o set_exception_handler?
- 18. Captura de excepciones no controladas en subprocesos secundarios en WPF
- 19. excepciones de archivo de serialización de impulso de captura
- 20. Manejo de excepciones. ¿Cuánto tiempo tarda la captura?
- 21. Captura de múltiples excepciones a la vez en Scala
- 22. Captura de excepciones específicas frente a genéricas en C#
- 23. Lanzar excepciones de un constructor en .NET
- 24. ¿Por qué esta diferencia de rendimiento? (Captura de excepciones)
- 25. Captura de todas las excepciones no controladas de Javascript
- 26. intento de captura en SQL Server
- 27. ¿Manejo de excepciones más elegante que varios bloques de captura?
- 28. cómo seleccionar palabras clave únicas de una coma separó etiquetas
- 29. .NET Controlador global de excepciones en la aplicación de consola
- 30. El manejo de excepciones en PL/SQL
Creo que es suficiente verificar el "número" (sin clase). La "clase" parece solo decir la gravedad. – slartidan