SQL异常的粒度更细
本文关键字:粒度 异常 SQL | 更新日期: 2023-09-27 17:47:49
在C#中,有没有一种方法可以通过SQL异常获得更精细的粒度?
我知道很多事情都可能出错,但我想以不同的方式处理某些情况,解析错误消息似乎不是很优雅。
此外,错误消息是由框架创建的还是特定于数据库的?
例如,如果我在INSERT上有一个主键冲突,那么错误消息将始终为:
违反PRIMARY KEY约束"PK_tblProduct"。无法在对象"dbo.tblProduct"中插入重复的密钥。
或者是SQLServer特定的。
更新
我看起来像是在寻找错误号码,知道在哪里可以得到各种错误号码吗?
我能用快速谷歌做的最好的事情是:18456:登录失败18488:密码已过期
如果您正在捕获一个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。