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