如何找到未关闭的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+F DataReader 并将其包装在 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();

因此,简单的解决方案就是对SqlDataReaderIDataReader 进行完整的项目搜索。如果是

不在 using 子句中或 不紧跟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?的主要内容,如果未能解决你的问题,请参考以下文章

Python DataReader - 更新新信息

如何解决实体框架打开 DataReader 问题

如何使用 FxCop 自定义规则验证 DataReader 是不是实际关闭?

.Net 的 SQLite:Datareader 关闭方法太慢

熊猫 Python UnicodeDecodeError

已经打开的 DataReader 的连接字符串出现问题