在.NET中捕获SQL唯一键异常

时间:2009-03-09 21:57:47

标签: .net asp.net sql

我想知道是否有人有更优雅的方法来检查.NET中SQL的唯一键异常,而不是解析错误消息?现在我在SQL中调用sproc,然后在.NET中使用try catch块。在try catch块中我解析错误消息,它是一个唯一键错误我向调用类抛出一个自定义错误的实例,如果不是我只是将原始异常抛出到调用类。这对我来说似乎非常低效。

4 个答案:

答案 0 :(得分:24)

如果捕获到SqlException,则应该能够枚举包含许多“SqlError”对象的“Errors”集合。

SqlError还包括“Class”和“Number”等属性 - 唯一的键冲突是class = 14和number = 2601.检查这些数字是否准确找到错误。

当您尝试在SQL Management Studio中执行查询时,这些错误代码相同:

  

Msg 2601,Level 14,State 1,Line 1
  无法插入重复的键行   对象..........
  声明已经终止。

“Msg”转换为SqlError上的“Number”属性,“Level”转换为“Class”。

try
{
  _cmd.ExecuteNonQuery();
}
catch(SqlException sqlExc)
{
   foreach (SqlError error in sqlExc.Errors)
   {
      string msg = string.Format("{0}: {1}", error.Number, error.Message);
   }
}

这样,您就可以轻松,准确地识别出“违反唯一约束”错误。

马克

答案 1 :(得分:2)

为什么不查询唯一ID是否存在? 获得异常会更好。

答案 2 :(得分:2)

解析错误消息是个坏主意。例如,如果您使用Ms SQL消息可以本地化(使用不同的语言),您将找不到您要查找的单词。

如果您使用的是Ms SQL,则应检查Number属性。

答案 3 :(得分:1)

明显的答案:在插入(或更新)之前尝试从数据库中获取该值,并在插入之前通知用户。

备选答案:检查SP内部的唯一性并将其作为来自SP的错误消息返回,然后您不必解析任何错误。他们都很糟糕。