2010-10-28 68 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

相关问题