static SqlDataReader GetReader()
{
//通过连接字符串获取连接
SqlConnection con = new SqlConnection(conn_String);
try
{
//打开连接,执行查询,并且返回SqlDataReader
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = Sql;
SqlDataReader dr = cmd.ExecuteReader();
//SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
finally
{
//con.Close();
//这样写是有问题的,con关闭数据库连接,返回的SqlDataReader将毫无用处,因为SqlDataReader依赖的con已经关闭
}
}
1. CommandBehavior.CloseConnection参数一般在 ExecuteReader() 中使用,作用是使返回对象前不关闭数据库连接。CloseConnection解决了流读取数据模式下,数据库连接不能有效关闭的情况。当DataReader对象在生成时使用了CommandBehavior.CloseConnection参数,那数据库连接将在DataReader对象关闭时自动关闭。
2. 若在finally中调用con.close()会使得 数据库连接关闭,SqlDataReader依赖的连接关闭,返回的SqlDataReader将毫无作用。若不调用con.close(),那么返回后该连接将无法关闭,因为外部无法再调用到这个对象。
3. 为了实现既不关闭连接,也不能保持连接始终打开,很多系统只能放弃使用Reader模式的数据源,或将con对象交给调用者,使其能在外部关闭。
4. CommandBehavior.CloseConnection 能保证在关闭SqlDataReader对象时,自动释放其依赖的连接。实现了既不关闭连接,也不能保持连接始终打开