3

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

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

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

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

违反主键约束“PK_tblProduct”。无法在对象“dbo.tblProduct”中插入重复键。

或者是特定于 SQLServer 的。

更新

我看起来像是在寻找错误号,知道在哪里可以获得各种错误号吗?

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

4

5 回答 5

1

如果您正在捕获 a SqlException,您应该可以访问.Number,它会为您提供 SQL 错误号;这可能是您最好的方法...(您也可以从InfoMessage事件中获得相同的结果,也可以用于非致命错误)。

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

于 2008-11-04T11:43:01.567 回答
1

您可以在此处找到错误代码

于 2008-11-04T12:07:58.210 回答
1

SQLException 的 .Number 成员似乎是我所追求的,这是迄今为止我设法找到的数字:

  • 17:SQL Server 不存在或访问被拒绝。
  • 4060:无效的数据库
  • 18456:登录失败
  • 547:外键违规
  • 1205:死锁受害者
  • 2627、2601:唯一索引/持续违规
于 2008-11-04T12:21:57.853 回答
0

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

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

于 2008-11-04T11:43:37.340 回答
0

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

于 2008-11-04T11:55:05.037 回答