SQL Exceptions的粒度更细?

时间:2008-11-04 11:35:04

标签: c# sql sqlexception

在C#中有没有办法通过SQL异常获得更精细的粒度?

我知道有很多可能会出错,但我想以不同的方式处理某些情况并解析错误消息似乎并不是很优雅。

是框架创建的错误消息还是数据库特定的?

例如,如果我在INSERT上发生主键违规,则错误消息将始终为:

违反PRIMARY KEY约束'PK_tblProduct'。无法在对象'dbo.tblProduct'中插入重复键。

或者是SQLServer特定的。

更新

我看起来像是在错误编号之后,我知道哪里可以得到各种错误编号?

我能用快速谷歌做的最好的是: 18456:登录失败 18488:密码已过期

5 个答案:

答案 0 :(得分:1)

如果要捕获SqlException,则应该可以访问.Number,它会为您提供SQL错误号;这可能是你最好的方法......(你可以从InfoMessage事件得到同样的非致命错误。)

当然,这不会区分表 - 你可以争辩说,如果你需要这种级别的粒度,你应该首先检查(在可序列化的隔离级别,理想情况下使用UPDLOCK),如果存在冲突则引发自己的错误数据

答案 1 :(得分:1)

您可以找到错误代码here

答案 2 :(得分:1)

SQLException的.Number成员似乎就是我所追求的,以下是我迄今为止找到的数字:

  • 17:SQL Server不存在或访问被拒绝。
  • 4060:数据库无效
  • 18456:登录失败
  • 547:ForeignKey Violation
  • 1205:DeadLock受害者
  • 2627,2601:独特索引/违反行为

答案 3 :(得分:0)

在SQL Server中,您可以使用各种错误函数返回有关sys.messages中遇到的错误的各种信息

您可以从BOL检索更多信息。

答案 4 :(得分:0)

回答问题的最后部分:错误消息的细节取决于数据库。有一些标准的SQL错误代码,但实际的文本将从DBMS更改为DBMS。甚至是否返回SQL标准错误代码取决于DBMS。