在 Microsoft.Data.SqlClient/System.Data.SqlClient 库中,随 SqlException 返回的 Sql 错误有一个名为 Number 的属性。
在许多 StackOverflow 问题和互联网上的其他讨论中,人们建议使用此属性来捕获与异常相关的特定问题(例如死锁、重复键等)。
但是,根据 Microsoft 官方文档,此属性可以从服务器错误代码(SQL Server 的 master.dbo.sysmessages 表)、Win32 错误代码填充,也可以有一些其他数字(例如 -2 表示超时)。这是否意味着根据抛出异常的位置,相同的数字可能意味着不同的事情?
数字 10054 就是一个例子。
另一个例子是233。
所以,我想了解为什么互联网上的每个人都建议使用这个数字来假设确切的 SQL 异常是什么,以及当相同的数字可能意味着不同的东西时它有多安全?
有一些重叠,你必须结合上下文来弄清楚。 根据经验,如果会话正常,您将始终查看 sys.messages,并且错误实际上来自 SQL Server。
如果您未能建立连接或连接突然中断,您将收到与 Winsock 错误代码相关的数字。