是否可能抛出SqlException并且属性Number == 0?

时间:2017-01-05 10:40:48

标签: c# sql sql-server sqlexception

尝试执行sql过程时,是否可能抛出SqlException,属性Number为0?

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

3 个答案:

答案 0 :(得分:0)

不,除了以下情况外,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是其Number数组中第一个条目的Errors属性的同义词,并且该数组可能包含多个项目。

答案 1 :(得分:0)

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

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被用来确定在这种特定情况下出了什么问题我们有错误的信息。

答案 2 :(得分:0)

有可能。

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

这是我的情况,例如: enter image description here