.net 解释SQL异常

.net 解释SQL异常,.net,sql-server,exception,ado.net,.net,Sql Server,Exception,Ado.net,在我的应用程序中,我有一个数据访问层,它将其他层从通信抽象到数据库 每当捕获到异常时,我都会记录异常堆栈跟踪以帮助查明问题,然后处理异常。这一切都很好,除了在连接问题上。 有时,与数据库的通信会丢失,我的日志文件会淹没在堆栈跟踪中。在本例中,我只想记录通信丢失的情况,每当通信恢复时,我也想记录该情况 这是一个问题,因为我似乎无法理解SQL异常代码。我想做的是,每当捕获到基于连接的异常时,记录连接丢失,每当我能够成功创建新连接时,记录连接恢复。 现在查看日志,我发现每当服务器重新启动时,我都会捕获

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

每当捕获到异常时,我都会记录异常堆栈跟踪以帮助查明问题,然后处理异常。这一切都很好,除了在连接问题上。 有时,与数据库的通信会丢失,我的日志文件会淹没在堆栈跟踪中。在本例中,我只想记录通信丢失的情况,每当通信恢复时,我也想记录该情况

这是一个问题,因为我似乎无法理解SQL异常代码。我想做的是,每当捕获到基于连接的异常时,记录连接丢失,每当我能够成功创建新连接时,记录连接恢复。 现在查看日志,我发现每当服务器重新启动时,我都会捕获一个编号为6005的异常。这个数字表明:

关闭正在进行中

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

进一步向下滚动,我看到10054出现异常,并显示以下消息:

已成功与服务器建立连接,但在预登录握手过程中发生错误

但是参考文献说错误10054表明

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


这给我的印象是,如果我假设错误10054是一个登录问题,那么在引发溢出异常的情况下,我可能会遇到问题。我想指出的是,在我的应用程序中,溢出异常永远不会发生,但我不想将此假设用于异常处理,因为它实际上是常规执行的异常。

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

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异常,但它将避免解释单个异常。您关心的是连接到数据库,该数据库是否工作,因此这将为您提供该信息并记录准确的错误。

我刚刚注意到,异常号10054仅在获取连接的方法中捕获。这可能会将登录错误与溢出错误分开。关于异常号及其消息,我仍然有一个问题。昨晚日志中出现了一些错误,错误号为121。出现异常的消息是“从服务器接收结果时发生传输级错误”,但错误号表表明“INSERT语句的select列表包含的项目多于INSERT列表。select值的数量必须与INSERT列的数量匹配。”。我真的被这些混杂的信息弄糊涂了:\这就是我正在做的。我还有一个方法可以处理在每个方法上抛出的SQLException,以避免出现样板代码,但潜在的问题仍然存在:当与错误号关联的异常消息与引用所说的不同时,如何正确识别错误?我应该期望不同的错误号可以分配给不同的异常消息吗?那没有多大意义。