2009-11-03 47 views
6

mi pregunta es cómo manejar la excepción sql en C#, ¿hay alguna manera de verificar qué tipo de la excepción sql arroja desde la capa de acceso a datos? Por ejemplo, si db arroja una excepción de restricción única, o una excepción de clave externa, ¿hay alguna manera de atraparla desde C#? ¿Cuál es el patrón de manejo de excepciones que está utilizando para estas excepciones db?¿Cómo manejo las excepciones de SQL específicas (por ejemplo, una violación de restricción única) en C#?

Respuesta

0

SqlException Catch

catch(SqlException ex) 
{ 
    foreach(SqlError error in ex.Errors) 
    { 

    } 
} 
1

puede comprobar el texto del mensaje, el número y lo enchufe caso de que saber el error ...

try { 
} 
catch (SqlException ex) 
{ 
string str; 
     str = "Source:"+ ex.Source;   
     str += "\n"+ "Number:"+ ex.Number.ToString(); 
     str += "\n"+ "Message:"+ ex.Message; 
     str += "\n"+ "Class:"+ ex.Class.ToString(); 
     str += "\n"+ "Procedure:"+ ex.Procedure.ToString(); 
     str += "\n"+ "Line Number:"+ex.LineNumber.ToString(); 
     str += "\n"+ "Server:"+ ex.Server.ToString(); 

     Console.WriteLine (str, "Database Exception"); 
} 
7

Tener un vistazo a la clase documentation of the SqlException, en particular, , en su properties: SqlException.Number, por ejemplo, debería permitirle identificar qué tipo de SqlException (restricción única, clave externa, ...) ocurrió.

Puede usar excepciones filtradas para detectar errores específicos. VB.NET:

Try 
    ... 
Catch ex as SqlException When ex.Number = ... 
    ... 
Catch ex as SqlException When ex.Number = ... 
    ... 
End Try 

C# (versión 6 o superior):

try 
{ 
    ... 
} 
catch (SqlException ex) when (ex.Number == ...) 
{ 
    ... 
} 
catch (SqlException ex) when (ex.Number == ...) 
{ 
    ... 
} 
1

Depende de la excepción y su base de datos. Su base de datos producirá un código de error único para las cosas específicas, como restricciones, permisos, etc., pero ese código de error varía de DB a DB. Oracle tiene un pdf MASIVO (2000+ páginas) que enumera todos los errores posibles que puede arrojar y estoy seguro de que Sqlserver tiene algo similar. Lo que quiero decir es que busca códigos de error específicos, entonces necesita trp solo aquellos en la sección catch y manejarlos de manera diferente a la multitud de otros errores que puede obtener.

Cuestiones relacionadas