如何判断SqlConnection是否有额外的SqlDataReader?
技术问答
260 人阅读
|
0 人回复
|
2023-09-14
|
现在,这比实际目的更具有好奇心。如果您有一个SqlConnection打开文件并附加其SqlDataReader然后试着用这个文件操作另一个查询,SqlConnection它会导致错误。我的问题是什么?SqlConnection知道读者对它有依附感。没有公共财产或的任何东西HasDataReader,那么SqlConnection班级怎么知道?" `6 P/ }4 j) |! ~9 W! L9 e
原始问题:( 不再相关)# D- y! D' @. W- y) U
嗨,我正在设置一些连接池的功能,以及一些我们已经发生的更常见的错误(它总是很容易修复,但我们不记得了reader.Close()!)当我们使用多种类型/方法连接时,一种方法会打开数据读取器,忘记关闭它。这不是很糟糕,因为很多时候你要做的就是进入调试器并上一层,然后检查函数,检查它是否有未关闭的数据读取器。3 }' P# H! v8 e _
现在,这是一个更大的问题。在这个连接池中,如果打开数据读取器,它是未知的,直到线程获得并尝试使用它。最初打开数据读取器的连接甚至可能不再存在。
; Q' h% w6 a. H" ^7 n* g. R如此简单,如何检测连接器上的数据读取器是否打开,是否有办法在不关闭连接的情况下关闭读取器?
' D1 u. h. e9 ~
6 O! {( L- G" s& I' V0 R" N1 g* } 解决方案:
: o" v" [4 U% \) u$ r SqlConnection如何知道读取器已经附加到读取器中?
% T5 L) o4 W% p据我所知,SQLConnection由于内部维护引用,知道它与读取器连接。
( C4 T5 T$ b* m' o) S+ Y对Reflector明智使用表明,SQLConnection对象的类型为DBConnectionInternal私有字段填充了许多抽象的具体实现之一。当您尝试向连接添加第二个实时读取器时,调用内部连接的方法
8 n v# O8 p: v V5 `# k+ {ValidateConnectionForExecute这将追溯到内部
8 }7 q8 x6 V: i; I$ ~" w4 E6 cReferenceCollection检查。当显示现有的实时阅读器时,会引起异常。
4 b7 u& d2 F: g$ C4 U" K2 L我想,如果你愿意,你可以通过反射挖掘所有的内容。 |
|
|
|
|
|