【问题标题】:How is SqlException Number assignedSqlException Number 是如何分配的
【发布时间】:2013-09-19 12:13:50
【问题描述】:

SqlException 具有 Number 属性。

然后是这个:http://msdn.microsoft.com/en-us/library/cc645603.aspx

还有这个:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

这似乎是其中之一

问题:

如何决定哪个?

询问原因:

我需要捕获某些 SqlExceptions 并根据 Number 属性决定如何处理它们,但我不知道应该查看哪个列表就像系统使用来自两者的消息一样,我不知道使用什么标准进行选择。

例如:

  • 编号 53 - 来自服务器错误消息列表(两者都存在)
  • 编号 10054 - 来自系统错误消息列表(两者都存在)
  • 数字 -1 - 来自服务器错误消息列表(仅存在于服务器列表中)
  • 编号 121 - 来自系统错误消息列表(两者都存在) ......

【问题讨论】:

    标签: sql-server ado.net sqlexception


    【解决方案1】:

    理论认为它是 SQL 错误号,例如。服务器端ERROR_NUMBER()。也就是说,第一个列表。

    但是,SqlClient 报告了许多发生在客户端而不是服务器端的异常。一个典型的例子是连接服务器失败之类的错误,因为你没有连接,所以没有服务器端错误可言。例如,错误的服务器名称(无法在 DNS 中解析),在这种情况下,InnerException 将指向 Win32ExceptionNativeErrorCode 的值为 ERROR_BAD_NETPATH。本例为53,OS系统错误码,会报SqlException错误号。

    其他情况SqlClient报错是socket错误,比如突然断开。同样,没有“服务器端”错误可言,SqlException 将使用众所周知的 WSA 错误编号之一的 NativeErrorCode 包装一个 SocketException(Win32Error 的子类)类型的 InnerException,例如 @987654327 @。在这种情况下,SqlException.ErrorNumber 将是 10054,但它是 WSA 范围中的 10054,而不是 SQL Server 错误范围中的 10054。我知道...

    那你应该怎么做?确保检查InnerException,如果是Win32Exception,那么ErrorNumber 来自系统错误代码(操作系统错误)。否则它应该是一个 SQL Server 错误号。

    哦,还有-1...我认为是SqlClient本身报告的(例如一些内部状态错误),但我不确定。

    【讨论】:

    • 出色的答案。值得注意的是,十六进制 Win32 代码在实际异常中被转换为十进制。例如,我们得到异常编号 258,其文本为 等待操作超时。 258 转换为十六进制是 0x102,从 Win32 codes 可以清楚地看出错误代码 0x00000102 与我们的错误文本匹配'再看。
    • 是否有一些文档可以保证这种行为? SqlException.Number 的 msdn 文章似乎对此保持沉默。
    【解决方案2】:

    我会查看 SqlException.Number 属性的文档。

    它是这么说的

    这是第一个 SqlError 的 Number 属性的包装器 错误属性。有关 SQL Server 引擎错误的详细信息,请参阅 SQL Server 联机丛书。

    【讨论】:

    猜你喜欢
    • 2012-01-14
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2021-09-18
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多