SQL异常的粒度更细

本文关键字:粒度 异常 SQL | 更新日期: 2023-09-27 17:47:49

在C#中,有没有一种方法可以通过SQL异常获得更精细的粒度?

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

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

例如,如果我在INSERT上有一个主键冲突,那么错误消息将始终为:

违反PRIMARY KEY约束"PK_tblProduct"。无法在对象"dbo.tblProduct"中插入重复的密钥。

或者是SQLServer特定的。

更新

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

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

SQL异常的粒度更细

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

当然,这并不能区分表——你可能会争辩说,如果你需要这种粒度级别,你应该首先进行检查(在可序列化的隔离级别,最好是使用UPDLLOCK),如果有冲突的数据,就会引发你自己的错误。

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

。SQLException的数字成员似乎就是我想要的,以下是我迄今为止设法找到的数字:

  • 17:SQL Server不存在或访问被拒绝
  • 4060:无效数据库
  • 18456:登录失败
  • 547:违反ForeignKey
  • 1205年:聋哑受害者
  • 26272601:唯一索引/持续违规

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

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

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