如何找到未关闭的DataReader?
Posted
技术标签:
【中文标题】如何找到未关闭的DataReader?【英文标题】:How to find unclosed DataReader? 【发布时间】:2011-03-10 14:27:46 【问题描述】:我在 ASP.Net 1.1 中维护了一个大型应用程序,该应用程序已被许多人(包括学生)修改。显然,代码很少被审查,所以它有很多......错误......愚蠢的错误。最成问题的是从未关闭的 DataReader。 而且到处都有,每页最多十个。由于这个项目大约有 100 页,包含 300 多个类,一想到要找到所有未关闭的 DataReader,我就感到沮丧。
我知道这是没有希望的,但是有没有一种简单的方法可以找到所有这些未关闭的 DataReader?一些软件或 Visual Studio 2003 调整...
【问题讨论】:
我认为唯一的方法是 ctr+FDataReader
并将其包装在 using
语句中。如果你有 ReSharper,你可以使用“Find Usages”在一个窗口中查看所有 DataReader
也许自定义 FxCop 规则会起作用?罢工 - 一些研究表明这可能不可行:***.com/questions/2408546/…
@Stecya:是的,但它们被隐藏在两种不同的解决方案中。而且我不能将它们包装在using
中,因为它是.Net 1.1。我已经放了很多try catch finally
,但还是不够:(
"Phoenix" 上面提到的线程看起来很有希望:blogs.msdn.com/b/codeanalysis/archive/2010/04/14/…
是的,在 VS2010 中。如果 .Net 1.1 的 VS2003 也一样,我就安息了。
【参考方案1】:
嗯,使用 DataReader 的“正确”方法是
using (SqlDataReader dr = ...)
...
或
SqlDataReader dr = ...
try
...
finally
dr.Close();
因此,简单的解决方案就是对SqlDataReader
和IDataReader
进行完整的项目搜索。如果是
try
那么很可能是使用不当,需要修复。
注意以下代码:
SqlDataReader dr = ...
...
// do something
...
dr.Close();
不正确,因为在// do something
期间抛出的异常将使 DataReader 保持打开状态。
【讨论】:
完全同意。但是这个项目是7年前开始的,版本在VSS上,还是有很多bug,我从去年就来了……我到处放了一些finally
,但是我没有时间去搜索全部手动。
Visual Studio 可以在文件中查找,您不必手动查找它们。或者使用grep
找到它们。是的,您必须手动进行修改,但也许您可以邀请您提到的一些学生来帮忙:)【参考方案2】:
尝试查找和替换下的文件替换功能。使用正则表达式。
-
将
SqlDataReader.*$
替换为using(\1) \
。
然后将using(using(.*) \
替换为\1
。
编译并检查每个错误并仅放置右花括号。
但请确保在开始之前备份文件。
这样,您可以跳过已经有using
块的那些以关闭数据读取器。
【讨论】:
以上是关于如何找到未关闭的DataReader?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 FxCop 自定义规则验证 DataReader 是不是实际关闭?