日期:2014-05-18  浏览次数:20761 次

询问ADO.NET中的SqlDataReader和SqlConnection的关闭问题
询问各位个问题:
我知道,如果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();


请知道详细技术细节的朋友们不吝赐教,鄙人感激不尽!谢谢!

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