2014-09-01 115 views
0

在我的应用程序中,我有一个数据访问层,将通信中的其他层抽象为数据库。解释SQL异常

每当发生异常时,我都会记录异常堆栈跟踪以帮助查明问题,然后处理异常。除非出现连接问题,否则这一切都很好。 有时,与数据库的通信会丢失,并且我的日志文件会在堆栈跟踪中淹死。在这种情况下,我只想记录该通信丢失,并且每当通信恢复时,我也想记录该通信。

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

正在关机

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

滚动进一步下跌,我看到10054的异常以下消息:

的连接已成功与服务器建立的,但随后的登录前的握手过程中出现错误。

但参考认为错误10054指示

为一列或多列的数据值溢出了提供所使用的类型。

这给了我一个印象,如果我认为错误10054是一个登录问题,我可能会遇到问题,以防万一发生溢出异常。我想说明的是,在我的应用程序中,绝不会出现溢出异常,但我不想将这种假设用于异常处理,因为它实际上是常规执行的例外。

+0

我刚刚注意到,例外编号10054仅在获取连接的方法中捕获。这可能会将登录错误与溢出错误分开。 – 2014-09-01 08:20:46

+0

我仍然有关于例外编号及其消息的问题。昨晚在日志中弹出一些错误,错误编号为121。随例外的消息是“从服务器接收结果时发生传输级别错误”,但错误编号表表明“INSERT语句的选择列表包含的项目多于插入列表。 SELECT值必须与INSERT列的数量匹配。“我对这些混合消息感到困惑:\ – 2014-09-10 08:24:18

回答

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例外,但它会避免需要解释个别例外情况。您关心的是连接到数据库,该数据库不管是否工作,所以这会给你提供这些信息并记录确切的错误。

+0

这就是我正在做的事情。我还有一种方法可以处理抛出每种方法以避免样板代码的SQLException,但底层问题仍然存在:如何正确识别错误,与错误编号关联的异常消息与何种方式不同参考文献说?我应该期望不同的错误号码可以分配给不同的异常消息吗?这没有什么意义。 – 2014-09-01 08:48:11