如何在C#中处理特定的SQLexception(例如,唯一约束违规)?

我的问题是如何在c#中处理sqlexception,无论如何都要检查从数据访问层抛出什么样的sqlexception? 例如,如果db抛出唯一约束exception或外键exception,有没有办法从c#中捕获它? 你用于这些数据库exception的exception处理模式是什么?

查看SqlException类的文档 ,特别是其属性 : SqlException.Number ,例如,应该允许您识别出现了哪种类型的SqlException(唯一约束,外键,…)。

您可以使用筛选的exception来捕获特定错误。 VB.NET:

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

C#(第6版及以上版本):

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

您可以检查消息文本,数字并在其上切换案例以了解错误…

 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"); } 

它取决于exception和您的数据库后端。 您的数据库将为约束,权限等特定事物生成唯一的错误代码,但错误代码因数据库而异。 Oracle有一个MASSIVE pdf(2000多页),它列出了它可以抛出的每个可能的错误,我确信Sqlserver有类似的东西。 我的观点是你在寻找特定的错误代码然后你需要trp只是在catch部分中的那些并处理它们,然后你可以得到许多其他错误。

捕获SqlException

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