【问题标题】:Is it possible that SqlException is thrown and property Number == 0?是否有可能抛出 SqlException 并且属性 Number == 0?
【发布时间】:2017-01-05 10:40:48
【问题描述】:

是否有可能在尝试执行sql过程时抛出SqlException并且属性编号为0?

具体情况:域控制器不可用/没有响应并且没有与sql server发生真正的通信。

【问题讨论】:

  • 您的意思是在之前已经打开 SqlConnection 时连接中断?在这种情况下,客户端组件仍会抛出“发生传输级错误...”消息,该异常确实有一个数字(19 - 物理连接不可用)。不过,个定义的错误状态为 number == 0。
  • 域控制器是指应用程序/URL 已关闭?
  • 这不仅是可能的,还有整个类的SqlException 实例在没有涉及SQL Server 的情况下被抛出,而且当这种情况发生时甚至都不容易知道。错误编号的分配不一致;有时你会得到一个 SQL 错误号,有时是一个 Win32 错误号。

标签: c# sql sql-server sqlexception


【解决方案1】:

有可能。

尝试连接在 ubuntu 容器内启动的 SQL 时收到 0。据此:https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-events-and-errors?view=sql-server-ver15 这是未记录的,可能是一个错误。

这是我的情况,例如:

【讨论】:

    【解决方案2】:

    不,SqlException.Number 应该不可能为 0,除了以下情况:

    • 只读路由失败
    • 服务器处理查询时出现严重错误
    • 在解析结果时处理取消
    • 创建用户实例失败

    假设您没有使用 SQL Server 2016 的只读路由,那么这些情况都不适用于您描述的场景。

    剩余的情况要么是来自 sysmessages 的非零数字,要么是 Win32 错误代码(因为 0 == ERROR_SUCCESS,也永远不会为零)。

    实际上,您会看到类似于“无法创建 SSPI 上下文”、“向服务器发送请求时发生传输级错误”或“现有连接被远程强制关闭”等内容主机”,并且那些也有非零 Win32 错误代码。

    参考:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlerror.number(v=vs.110).aspx

    值得注意的是,SqlException.Number 是其Errors 数组中第一个条目的Number 属性的同义词,并且该数组可能包含多个项目。

    【讨论】:

      【解决方案3】:

      回答我自己的问题。对的,这是可能的。我们添加了额外的代码来捕获:

      catch (SqlException ex)
      {
          for (int i = 0; i < ex.Errors.Count; i++)
          {
              this.logger.Error("Index #" + i + "\n" +
              "Message: " + ex.Errors[i].Message + "\n" +
              "Error Number: " + ex.Errors[i].Number + "\n" +
              "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
              "Source: " + ex.Errors[i].Source + "\n" +
              "Procedure: " + ex.Errors[i].Procedure + "\n");
          }                       
      
          if (ex.Number == 0)
          {
              this.logger.Warn("Exception was caught but ex.Number == 0! Changing to -69.");
              oResults.Add("_ExitCode", "-69");
          }
      }   
      

      这是今天记录的。

      2017-01-17 08:05:08,282 [r074008903] ERROR ProcessLogger Index #0
      Message: A severe error occurred on the current command.  The results, if any, should be discarded.
      Error Number: 0
      LineNumber: 0
      Source: .Net SqlClient Data Provider
      Procedure: 
      
      2017-01-17 08:05:08,282 [r074008903] ERROR ProcessLogger Index #1
      Message: A severe error occurred on the current command.  The results, if any, should be discarded.
      Error Number: 0
      LineNumber: 0
      Source: .Net SqlClient Data Provider
      Procedure: 
      
      2017-01-17 08:05:08,283 [r074008903] WARN  ProcessLogger Exception was caught but ex.Number == 0! Changing to -69.
      

      因为在其他地方 _ExitCode 用于确定在这种特定情况下是否有问题,我们有虚假信息。

      【讨论】:

        猜你喜欢
        • 2015-10-23
        • 1970-01-01
        • 2012-08-12
        • 2017-11-04
        • 1970-01-01
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多