如何判断一个SqlConnection是否有已连接的SqlDataReader?

14

这现在更多是出于好奇而非实际目的。如果您打开了一个 SqlConnection 并将一个 SqlDataReader 附加到它上面,然后尝试使用相同的 SqlConnection 运行另一个查询,那么它会抛出错误。我的问题是,SqlConnection 怎么知道有一个 reader 已经附加到它上面了。它没有公共属性或其他东西来表示是否具有 HasDataReader,那么 SqlConnection 类是怎么知道的?


原始问题:(已不再相关)

嗨,我正在设置一个小型连接池,我们遇到的一个更常见的 bug(通常很容易修复,但我们却无法记住 reader.Close()!)就是当一个连接被许多类/方法使用且一个方法打开了数据阅读器并忘记关闭它时。这不是真正的坏事,因为很多时候你只需要进入调试器,向上一级并查看之前的函数,检查它是否有未关闭的数据阅读器。

现在,这里有一个更大的问题。在这个连接池中,如果一个数据阅读器是打开的,则直到一个线程获取连接并尝试使用它之前,我们不知道是否有数据阅读器打开。最初打开数据阅读器的东西可能已经不存在了。

因此,简而言之,如何检测连接上是否有数据阅读器打开,是否有一种方法可以关闭 reader 而不关闭连接?


只是想确认一下 - 你不是在尝试编写自己的连接池机制吧?连接池已经由框架在后台处理了;你不需要自己做任何事情。 - Greg Beech
2
哇.. 我实际上不知道它提供连接池.. 我猜它是如此隐含,启用它只需要很少的工作,我错过了它..那么这个问题就不再相关了。 - Earlz
@earlz - 非常好!详情请参见:http://msdn.microsoft.com/zh-cn/library/8xx3tyca.aspx。 - Jeff Sternal
12个回答

0

1
请不要在回答中只贴链接而不添加相关内容。如果该链接失效,那么您的回答对未来的访问者将毫无用处。 - Brandon

0
使用相同的连接(connection)创建新的命令对象(command object)和新的数据读取器(data reader),这样可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接