询问各位个问题:
我知道,如果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();
请知道详细技术细节的朋友们不吝赐教,鄙人感激不尽!谢谢!
我知道,如果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();
请知道详细技术细节的朋友们不吝赐教,鄙人感激不尽!谢谢!
2.针对using语句中声明的SqlConnection,该对象在系统自动调用其Dispose()方法。需手动关闭连接池有数目限制
谢谢你的回复!
但我还是有些不明白:
1.SqlDataReader到底什么时候才会自动关闭呢?
当你关闭连接的时候自动关闭DataReader对象,所以方法的内部不用关闭连接,在调用方法出关闭连接即可
connection open
read
connection close
否则如果不close
马上在同一个connection上new一个新reader执行别的语句 会出错说有未关闭的的reader
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);关闭SqlDataReader 的时候会自动关闭连接的。
SqlDataReader 需要手动关闭,但不是必要,它是托管的,C#垃圾回收器会自动进行回收的;但是我们能自己关闭的时候还是自己关闭,高效利用系统资源。
using(SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); )
http://blog.csdn.net/levin9/archive/2006/02/14/599115.aspx