2010-10-28 69 views
8

我收到錯誤「新事務不允許,因爲有其他線程正在運行」在我正在處理的應用程序中。它在重構過程中,特別是在創建測試套件期間出現。有沒有辦法檢測SqlConnection上的開放閱讀器?

我環視這意味着我可能有一個數據讀取器,當我創建事務仍然打開實現,但它是一個複雜的應用程序,問題出在哪裏不是很明顯我。因此,我希望能夠確定讀者連接到SqlConnection的問題。

理想情況下,我希望能夠在Visual Studio中添加手錶,然後在調試模式下逐步查看連接的閱讀器數量何時發生變化。

有沒有辦法做到這一點?我在C#工作。

在此先感謝。

馬丁

回答

7

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問題)。

+0

哇,有人投這個答案(我花了時間工作了)下調爲「沒有用處」。我很想知道爲什麼。 – marsbard 2010-10-28 21:34:52

+0

白癡到處都是。 - 尼斯找到 - 我知道有沒有辦法讓從公開的接口,但很明顯的連接需要有一個參考的地方。那麼,至少有一些開放的讀者。 – TomTom 2010-10-29 08:45:39

+0

幹得好。投票+1。 – TomTom 2010-10-29 08:46:10

1

您可能會發現這個thread的興趣。

編輯:看起來他們得到在DbConnectionInternalReflector,並提供免費版本。至於反思,它確實不是太複雜。關於MSDN有一個體面的概述。

Edit2:剛纔意識到你已經知道了。大。 :)我會離開編輯,以防其他人想要更多信息。

+0

這是一個有趣和相關的線程。我有點出我的深度嘗試使用反射雖然:)我也無法通過在調試模式下智能感知的助手,當點擊找到DBConnectionInternal時。 – marsbard 2010-10-28 14:02:44

+0

感謝您的反饋鏈接。看起來不錯。 – marsbard 2010-10-29 09:25:49

相關問題