询问各位个问题:
我知道,如果SqlDataReader不关闭的话,会导致关联的SqlConnection不可进行其他操作;
但是,我在很多代码上都看到很多SqlDataReader没有被显示关闭的情况,所以,我想了解下SqlDataReader什么条件下会自动关闭呢?
我在一书上看到这样的话:“当SqlCommand调用ExecuteReader(CommandBehavior.CloseConection)后,当从SqlDataReader对象中读取了所有的数据记录后,连接将会自动关闭”,这句话的意思是否反映了这一个事实:SqlDataReader将在SqlDataReader.Read()==false后,由.NET自动关闭呢?而不需要我们手动调用SqlDataReader.Close()方法了?但这与我以前的了解有矛盾!
还有,我看过这样一段代码:
    public List<Movie1> GetAll()
    {
        List<Movie1> results = new List<Movie1>();
        SqlConnection con = new SqlConnection(_connectionString);
        SqlCommand cmd = new SqlCommand("SELECT Title,Director FROM Movies", con);
        using (con)
        {
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                Movie1 newMovie = new Movie1();
                newMovie.Title = (string)reader["Title"];
                newMovie.Director = (string)reader["Director"];
                results.Add(newMovie);
            }
        }
        return results;
    }
该段代码对关联的SqlConnection对象使用了using语句,以保证SqlConnection在异常或语句块结束后自动Dispose(),但是,如果SqlDataReader始终需要手动调用SqlDataReader.Close()关闭的话,未关闭SqlDataReader之前,SqlConnetion可以被Dispose()么?难道是SqlConnection的系统构造的Dispose()方法内包含了相关SqlDataReader的SqlDataReader.close()方法的调用,然后再在该方法内调用SqlConnection.Close()?
归根到底,我想知道的就是:
1.SqlDataReader可不可以自动关闭,而不需要手动显式调用Close()?如果可以,什么时候会自动关闭?
2.针对using语句中声明的SqlConnection,该对象在系统自动调用其Dispose()方法时,是否也会自动调用相关SqlDataReader.Close()后,再进行SqlConnection.Close();
请知道详细技术细节的朋友们不吝赐教,鄙人感激不尽!谢谢!

解决方案 »

  1.   

    SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
      

  2.   

    1.SqlDataReader可以自动关闭,不需要手动显式调用Close()
    2.针对using语句中声明的SqlConnection,该对象在系统自动调用其Dispose()方法。需手动关闭连接池有数目限制
      

  3.   


    谢谢你的回复!
    但我还是有些不明白:
    1.SqlDataReader到底什么时候才会自动关闭呢?
      

  4.   

    应该是先CLOSE()然后DISPOSE()
      

  5.   


    当你关闭连接的时候自动关闭DataReader对象,所以方法的内部不用关闭连接,在调用方法出关闭连接即可
      

  6.   

    最好是
    connection open
    read
    connection close
    否则如果不close
    马上在同一个connection上new一个新reader执行别的语句 会出错说有未关闭的的reader
      

  7.   

    MSDN上说是,不关闭datareader是不能对它调用的connection 做其它操作的。所以你说的错误是必然的。如果
    SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);关闭SqlDataReader 的时候会自动关闭连接的。
    SqlDataReader 需要手动关闭,但不是必要,它是托管的,C#垃圾回收器会自动进行回收的;但是我们能自己关闭的时候还是自己关闭,高效利用系统资源。
      

  8.   

    如果你不愿意关闭,那么可以这样:
    using(SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); )
      

  9.   

    我说的有点问题,SqlDataReader 不关闭的话,connection连接池会满。至于没有显式关闭,那是 SqlDataReader 在和GridView等复杂控件邦定后,会自动关闭,请看这篇文章:
    http://blog.csdn.net/levin9/archive/2006/02/14/599115.aspx