这个真的可以吗第一种方法测试的结果是dr关闭了,connection也关闭了protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MSPetShop4;Integrated Security=True"))
            {
                SqlCommand command = new SqlCommand("select * from Product", conn);
                conn.Open();                using (SqlDataReader rdr = command.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    GridView1.DataSource = rdr;
                    GridView1.DataBind();
                    Response.Write(rdr.IsClosed + "<br>");//结果为True
                    Response.Write(conn.State);//结果为False
                }
            }
        }
    }第二种方法测试 dr也关闭了,connection也关闭了
public partial class _Default : System.Web.UI.Page 
{
    public delegate void IDataReaderHandler(IDataReader reader);
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GetAuthor(new _Default.IDataReaderHandler(databind));
            //using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MSPetShop4;Integrated Security=True"))
        }
    }    public void GetAuthor(IDataReaderHandler handler)
    {
        using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MSPetShop4;Integrated Security=True"))
        {
            SqlCommand command = new SqlCommand("select * from Product", conn);
            conn.Open();            using (SqlDataReader rdr = command.ExecuteReader(CommandBehavior.CloseConnection))
            {
                handler(rdr);
                Response.Write(rdr.IsClosed + "<br>");//这样也是True
                Response.Write(conn.State);//False
            }
        }
    }    public void databind(IDataReader dr)
    {
        GridView1.DataSource = dr;
        GridView1.DataBind();
    }
}这两种方法到底哪个才是真正的关闭了呢

解决方案 »

  1.   

    用dataset,datareader只读一个条数据,要用循环的
      

  2.   

    using运行结束后会自动调用Dispose()释放资源的,并且DataReader对象是独占连接的,也就是在它操作期间,连接对象不能同时再作其他的事情,直到reader关闭
    LZ想说什么呢?
      

  3.   

    你看上面两个都是关闭的dr,那么访问量,数据量比较大的时候,在using里面绑定数据,调用委托,dr会立即释放吗
      

  4.   

    搜索到了这个,你看一下    c# IDataReader造成的资源泄漏
      

  5.   


    你这两种有区别吗?都使用USING,USING会自动调用Dispose()释放资源。
    在USING的范围内的东东,会自动释放资源
      

  6.   

    很明显的第一种,using中的大括号中的链接只能是在大括号范围内有效,出去就自动回收关闭了。而第二种是跳出方法执行的一旦遇到错误下面的关闭语句就不执行了。
      

  7.   

    DataReader如果不close得话,那得让CLR自动回收,访问量大的话,第一种就不能及时关闭了了第二种 不知道,请教大家
      

  8.   

    DataReader 是按要求查询,直到找到值为止才会停止额把?
      

  9.   


    释放什么?空间?如果你认为IDisposable接口就是用来释放空间的,就根本错了。对于SqlConnection和SqlDataReader执行Dispose,哪一个也不会释放空间啊!就你的两个代码来说,哪一个都可以,而且你的代码还有冗余动作。在根本不需要调用DbDataReader的Dispose方法时,如果写道using{}结构里边就有点画蛇添足的。说来说去,关键就是为了及时调用SqlConnection的Close方法(而且即使异常情况下也可以调用),而且根本不是为了释放什么SqlConnection的对象实例的内存空间,而是为了让其与底层物理连接脱离开,把底层的连接放到连接池里下一个SqlConnection对象实例使用(而当前的实例控件根本不需要立刻释放)。
      

  10.   

    而当前的实例控件根本不需要立刻释放  -->  而当前的实例空间根本不需要立刻释放
    一说到“释放资源”,很多人只能想到使用的内存字节释放掉这个概念。其实根本不是这个意思。比如说锁的释放、端口的释放、画笔的释放、独占文件的释放,等等这些资源提前释放,而不是等到GC来释放空间时才释放资源,是这个意思。
      

  11.   

    第二种你不是在外面也套了using吗?
    也可以放在委托里面,外面就可以不用了,using 会被编译成try-finall
             public void databind(IDataReader dr)
            {
                //if(dr == null) throw ...
                using (dr)
                {
                    GridView1.DataSource = dr;
                    GridView1.DataBind();
                }
            }