SqlException.Number 对于 SQL Server 异常来说是唯一的吗?

问题描述 投票:0回答:1

在 Microsoft.Data.SqlClient/System.Data.SqlClient 库中,随 SqlException 返回的 Sql 错误有一个名为 Number 的属性。

在许多 StackOverflow 问题和互联网上的其他讨论中,人们建议使用此属性来捕获与异常相关的特定问题(例如死锁、重复键等)。

但是,根据 Microsoft 官方文档,此属性可以从服务器错误代码(SQL Server 的 master.dbo.sysmessages 表)、Win32 错误代码填充,也可以有一些其他数字(例如 -2 表示超时)。这是否意味着根据抛出异常的位置,相同的数字可能意味着不同的事情?

数字 10054 就是一个例子。

  1. 根据互联网上的数据,当存在连接问题时会抛出此错误 - https://dba.stackexchange.com/questions/329332/unable-connect-to-sql-server-on-ssms-and -得到错误-10054
  2. 根据我在 SQL Server 的 master.dbo.sysmessages 表中看到的内容,数字 10054 对应于“一个或多个列的数据值溢出了提供程序使用的类型。”。

另一个例子是233。

  1. 根据互联网上的数据,当存在连接问题时也会抛出此错误 - SQL Server 连接任意返回 233 或 18456 错误代码
  2. 根据我在 SQL Server 的 master.dbo.sysmessages 表中看到的内容,数字 233 对应于“表 '%.*ls' 中的列 '%.*ls' 不能为空。”

所以,我想了解为什么互联网上的每个人都建议使用这个数字来假设确切的 SQL 异常是什么,以及当相同的数字可能意味着不同的东西时它有多安全?

c# .net sql-server sqlclient microsoft-data-sqlclient
1个回答
0
投票

有一些重叠,你必须结合上下文来弄清楚。 根据经验,如果会话正常,您将始终查看 sys.messages,并且错误实际上来自 SQL Server。

如果您未能建立连接或连接突然中断,您将收到与 Winsock 错误代码相关的数字。

© www.soinside.com 2019 - 2024. All rights reserved.