繁体   English   中英

有没有办法在SqlConnection上检测开放阅读器?

[英]Is there a way to detect open readers on a SqlConnection?

我在我正在处理的应用程序中收到错误“不允许新事务,因为还有其他线程正在运行”。 它在重构期间出现,特别是在创建测试套件期间。

我从环顾四周意识到这意味着我在创建事务时可能还有一个数据阅读器仍处于打开状态,但它是一个复杂的应用程序,对我来说问题不明显。 因此,我希望能够找出读者连接到有问题的SqlConnection的内容。

理想情况下,我希望能够在Visual Studio中添加一个监视,然后在调试模式中单步执行以查看连接的读取器的数量何时发生变化。

有没有办法做到这一点? 我在C#工作。

提前致谢。

马丁

唷! 我现在对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问题)时,连接上没有数据读取器打开接着就,随即。

你可能会发现这个线索的兴趣。

编辑:看起来他们使用Reflector获得DbConnectionInternal ,并且提供免费版本。 至于反思,真的不是太复杂。 MSDN上有一个不错的概述。

编辑2:刚认识到你已经弄清楚了。 大。 :)我将离开编辑以防其他人想要更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM