Sql server 如何分配SqlException编号
SqlException具有属性Number 然后是: 这是: 而且似乎是这样或那样 问题: 如何决定哪一个 询问原因: 我需要捕获某些SqlExceptions,并根据Number属性决定如何处理它们,但我不知道当系统似乎同时使用来自这两个属性的消息时,应该查看哪个列表,我也不知道选择的标准是什么 例如:Sql server 如何分配SqlException编号,sql-server,ado.net,sqlexception,Sql Server,Ado.net,Sqlexception,SqlException具有属性Number 然后是: 这是: 而且似乎是这样或那样 问题: 如何决定哪一个 询问原因: 我需要捕获某些SqlExceptions,并根据Number属性决定如何处理它们,但我不知道当系统似乎同时使用来自这两个属性的消息时,应该查看哪个列表,我也不知道选择的标准是什么 例如: 编号53-来自服务器错误消息列表(两者都存在) 编号10054-来自系统错误消息列表(两者均存在) 编号-1-来自服务器错误消息列表(仅存在于服务器列表中) 编号121-来自系统错误消息列
- 编号53-来自服务器错误消息列表(两者都存在)
- 编号10054-来自系统错误消息列表(两者均存在)
- 编号-1-来自服务器错误消息列表(仅存在于服务器列表中)
- 编号121-来自系统错误消息列表(两者都存在)
理论上,这是SQL错误号,例如服务器端。换句话说,第一个列表 但是,SqlClient报告的一些异常发生在客户端,而不是服务器端。一个典型的例子是连接到服务器失败之类的错误,因为您没有连接,所以不存在服务器端错误。例如,错误的服务器名称(在DNS中无法解析),在这种情况下,
InnerException
将指向值为的。在本例中,操作系统错误代码53将报告为SqlException错误号
在其他情况下,SqlClient报告的错误是套接字错误,比如突然断开连接。同样,这里没有所谓的“服务器端”错误,SqlException将使用一个众所周知的WSA错误号(如,Win32Error的子类)封装一个InnerException类型。在这种情况下,SqlException.ErrorNumber
将是10054,但它是WSA范围中的10054,而不是SQL Server错误范围中的10054。我知道
那你该怎么办?确保检查InnerException
,如果是Win32Exception
,则ErrorNumber
来自系统错误代码(操作系统错误)。否则,它应该是SQL Server错误号
哦,还有
-1
。。。我认为这是SqlClient本身报告的(例如,一些内部状态错误),但我不确定。感谢您为我指出了正确的方向(这:)精彩的答案。值得注意的是,十六进制Win32代码在实际异常中转换为十进制。例如,我们得到的异常号为258,文本为等待操作超时。258转换为十六进制是0x102,从中可以清楚地看出,错误代码0x00000102与我们看到的错误文本相匹配。是否有一些文档可以保证这种行为?SqlException.Number的msdn文章似乎对此没有提及。