可以使用SqlException.LineNumber 来识别异常是不是与连通性有关吗?
Posted
技术标签:
【中文标题】可以使用SqlException.LineNumber 来识别异常是不是与连通性有关吗?【英文标题】:Can SqlException.LineNumber be used to identify whether an exception is related to connectivity?可以使用SqlException.LineNumber 来识别异常是否与连通性有关吗? 【发布时间】:2011-11-02 13:40:10 【问题描述】:我查看了 Transient Fault Handling Framework 代码试图解决 temporary loss of connectivity to SQL Server。这里有一个关键点:SqlException
在出现与 SQL 相关的问题(如语法错误)和与 SQL 无关的问题(如无连接)时都会抛出。
当然,我只需要尝试从后一类问题中恢复 - 如果我的代码运行格式错误的查询,我需要快速失败,而不是重试任何事情。
框架试图通过检查SqlError.Number
并将其与大量硬编码值进行比较来区分这些类。一旦 SQL Server 内部发生变化,基于此策略的大量知识和代码肯定需要维护。
我想也许我可以改用SqlException.LineNumber
?根据 MSDN,行号从 1 开始,行号 0 表示 行号不适用,所以我猜这意味着问题与 SQL 无关。我尝试了一段时间 - 每当我遇到连接问题时,LineNumber
总是为零。
使用SqlException.LineNumber
是一种可靠的方法来确定异常是由于 SQL 查询问题还是由于连接问题造成的?
【问题讨论】:
从帮助看来,它似乎只填充在查询和存储过程中。我不知道优化是否会导致 LineNumber 在查询中为 0。如果你能断言,我想它是可靠的。 那些硬编码的消息在 sys.messages 系统目录视图中定义,随着微软非常重视兼容性,这些消息很可能多年来不会改变 @Thiago Dantas:是的,但是可能会添加一些新代码,我的代码必须能够识别它们。 如果行号行为发生变化,您必须更改代码。如果它已经在工作,我不会费心去改变它。 一个不起作用的例子。LINENO 0; SELECT 1/0
【参考方案1】:
我不相信您可以可靠地使用 LineNumber 属性来指示异常是与连接相关的错误。当存储过程、触发器或函数期间发生错误时,将设置 LineNumber。但是,在这些项目之外的查询中,甚至在可能导致 LineNumber 为 0 的 SqlException 的视图中,您仍然可能会遇到错误。最好的方法是使用您描述的使用 Number 属性与硬编码值集相比的技术。
【讨论】:
以上是关于可以使用SqlException.LineNumber 来识别异常是不是与连通性有关吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用位置变量时是不是可以解决 SC2001(“看看是不是可以使用 $variable//search/replace”)?
是否可以使用 StreamingHttpResponse 生成 PDF,因为可以使用 CSV 来生成大型数据集?
如果可以使用 synchronized(this),为啥还要使用 ReentrantLock?