Phew!那么我现在就更多地了解Reflection了!
对于其他寻找答案的人,下面是一个返回SqlConnection数据读取器数量的方法。
public static int CountConnectedReaders(SqlConnection conn)
{
int readers = 0;
Type t = conn.GetType();
MemberInfo[] minf = t.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance);
for (int i = 0; i < minf.Length; i++)
{
if (minf[i].Name == "get_InnerConnection")
{
MethodInfo methinf = (MethodInfo)minf[i];
object result = methinf.Invoke(conn, new object[0]);
PropertyInfo[] pinfs = result.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (PropertyInfo pinf in pinfs)
{
if (pinf.PropertyType.Name == "DbReferenceCollection")
{
object dbrc = pinf.GetValue(result, new object[0]);
if (dbrc == null) readers = 0;
else
{
MemberInfo[] dbrcInfs = dbrc.GetType().GetMembers(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (MemberInfo dbrcInf in dbrcInfs)
{
if (dbrcInf.Name == "_dataReaderCount")
{
FieldInfo finf = (FieldInfo)dbrcInf;
readers = (Int32) finf.GetValue(dbrc);
}
}
}
}
}
}
}
return readers;
}
有趣的是,我的问题代码中使用这表明有些时候我得到的连接上打开没有数据的读者“新的事物是不允许的,因为还有其他正在运行的线程”错误,以便回到绘图板(或至少另一个SO问题)。
哇,有人投这个答案(我花了时间工作了)下调为“没有用处”。我很想知道为什么。 – marsbard 2010-10-28 21:34:52
白痴到处都是。 - 尼斯找到 - 我知道有没有办法让从公开的接口,但很明显的连接需要有一个参考的地方。那么,至少有一些开放的读者。 – TomTom 2010-10-29 08:45:39
干得好。投票+1。 – TomTom 2010-10-29 08:46:10