询问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); )