解释SQL异常

时间:2014-09-01 07:58:47

标签: .net sql-server exception ado.net

在我的应用程序中,我有一个数据访问层,它将其他层从通信抽象到数据库。

每当捕获到异常时,我都会记录异常堆栈跟踪以帮助查明问题,然后处理异常。除了涉及连接问题外,这一切都很好,很花哨。 有时,与数据库的通信会丢失,我的日志文件会被堆栈跟踪淹没。在这种情况下,我只想记录通信丢失,并且每当通信恢复时,我也想记录它。

这是一个问题,因为我似乎无法理解SQL异常代码。我想做的是每当捕获基于连接的异常时记录连接丢失,并且每当我可以成功创建新连接时记录连接恢复。 现在看一下日志,我看到每当服务器重新启动时,我都会捕获一个数字为6005的异常。According to the reference这个数字表示:

  

SHUTDOWN正在进行中

这也是异常消息,因此异常与错误代码匹配。

向下滚动,我看到10054的异常,并显示以下消息:

  

与服务器成功建立连接,但在登录前握手期间发生错误。

但参考文献说错误10054表示

  

一个或多个列的数据值溢出了提供程序使用的类型。

这给我的印象是,如果我假设错误10054是登录问题,我可能会遇到问题,以防万一引发溢出异常。我想要注意的是,在我的应用程序中,溢出异常应该永远不会发生,但我不想将该假设用于异常处理,因为它实际上是常规执行的例外。

1 个答案:

答案 0 :(得分:0)

您可以简化此操作,只需创建一个方法来为您打开数据库连接,并在失败时捕获/处理错误。像这样(未经测试)

public bool OpenConnection ()
{
    try 
    {
        using(var connection = new ADODB.Connection(...)) 
        {
            connection.Open();
            return true;
        }
    } 
    catch (Exception ex)
    {
        // log the exception
        return false;
    }
}

然后在您的代码中调用该方法并在连接无法打开时处理案例:

if (OpenConnection() == false)
{
    // Log / handle / throw error to state the connection failed to open
}
else
{
    // Run the code
}

此方法仍会记录SQL异常,但它将避免解释单个异常的需要。您关注的是连接到数据库,无论数据库是否有效,因此这将为您提供该信息并记录确切的错误。