zoukankan      html  css  js  c++  java
  • Trick: 巧用.NET Reflection从SqlConnection回溯到打开着的SqlDataReader。(Find the live SqlDataReader from SqlConnection)

    相信使用过ADO.NET的同志多半都见过这个exception吧:

    There is already an open DataReader associated with this Command which must be closed first.

    抛出这个exception的主要原因是:一个SqlConnection只能和一个开着的SqlDataReader相关联。当开发人员忘记关掉打开的SqlDataReader,而又尝试打开一个新的SqlDataReader的时候,BCL就会抛出上述异常。重现方法如下:

    Code

     

    这段代码很简单,我们一眼就能看出那个罪恶的DataReader。但是在实际的开发环境中,代码的封装会造成当 SqlDataReader reader2 = cmd.ExecuteReader(); 抛出exception时,我们很难找到那个忘关的DataReader。

    下面,我将介绍一种方法,从SqlConnection回溯到打开着的SqlDataReader。

    SqlConnection自身是没有任何public的方法可以返回当前打开着的SqlDataReader的,但是SqlConnection却有一些internal method能帮助我们得到所要的信息。它们是:

    SqlConnection SqlInternalConnection GetOpenConnection(); 
    SqlInternalConnection SqlDataReader FindLiveReader(SqlCommand command); 
    SqlDataReader SqlCommand Command { get; }


    由于这些方法都是internal的,我们需要依赖于.NET Reflection才能call到它们:

    GetLiveDataReaderCommand


    GetLiveDataReaderCommand 接收一个SqlConnection 对象,并寻找其中open着的SqlDataReader。如果找到,则返回这个SqlDataReader对应SqlCommand的SQL语句。

    当然,为了彻底根除忘关SqlDataReader的错误,推荐您还是使用using关键字从而SqlDataReader.Dispose方法会被自动call到:

    Code
  • 相关阅读:
    兄弟连新版ThinkPHP视频教程2.ThinkPHP 3.1.2 MVC模式和URL访问
    兄弟连新版ThinkPHP视频教程1.ThinkPHP 3.1.2 介绍及安装
    【算法】高效计算n的m次方
    linux下解压.zip压缩包出现乱码的问题解决
    马哥linux笔记--重定向
    JavaScript的基本知识
    repeater做删除前弹窗询问
    网页中图片路径错误时显示默认图片方法
    添加分页
    javascript类型转换
  • 原文地址:https://www.cnblogs.com/Jialiang/p/1429174.html
Copyright © 2011-2022 走看看