/// <summary>
/// 常见的获取SqlDataReader方法 /// 通常的数据访问层都会提供这个方法 /// </summary> static SqlDataReader GetReader() { //通过连接字符串获取连接 SqlConnection con = new SqlConnection(conn_String); try { //打开连接,执行查询 //并且返回SqlDataReader con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = Sql; SqlDataReader dr = cmd.ExecuteReader(); return dr; } finally { //这里的代码处于两难的境地 //如果这里执行关闭:con.Close();那返回的 SqlDataReader将毫无用处,因为其 //依赖的连接已经关闭 //如果这里不执行con.Close();那返回后该连接 将永远无法关闭,因为调用方无法 //得到连接对象 } } |
partial class UseCommandBehavior
{ //数据库看连接字符串 const String conn_String = "Server=localhost;Integrated Security=true;database=NetTest"; const String Sql = "select * from dbo.DepartCost"; /// <summary> /// 使用CommandBehavior.CloseConnection /// </summary> /// <param name="con">为了测试需要,传入连接对象</param> static SqlDataReader GetReader_CloseConnection(SqlConnection con) { try { //打开连接,执行查询 //并且返回SqlDataReader con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = Sql; SqlDataReader dr = cmd.ExecuteReader (CommandBehavior.CloseConnection); return dr; } finally { //因为使用了CommandBehavior.CloseConnection, //这里不需要关闭连接 //con.Close(); } } /// <summary> /// 不使用CommandBehavior.CloseConnection /// </summary> /// <param name="con">为了测试需要,传入连接对象</param> static SqlDataReader GetReader_NoCloseConnection(SqlConnection con) { try { //打开连接,执行查询 //并且返回SqlDataReader con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = Sql; SqlDataReader dr = cmd.ExecuteReader(); return dr; } finally { //为了使返回的SqlDataReader可用,这里不能关闭连接 //con.Close(); } } } |
partial class UseCommandBehavior
{ /// <summary> /// 测试方法 /// </summary> static void Main(string[] args) { //建立连接 SqlConnection con = new SqlConnection(conn_String); try { //测试使用了CommandBehavior.CloseConnection的方法 Console.WriteLine("测试使用了CommandBehavior. CloseConnection的方法:"); SqlDataReader sdr = GetReader_CloseConnection(con); while (sdr.Read()) { } sdr.Close(); Console.WriteLine("读取完毕后的连接状态:" + con.State.ToString()); //测试没有使用CommandBehavior.CloseConnection的方法 Console.WriteLine("测试没有使用CommandBehavior. CloseConnection的方法:"); SqlDataReader sdr1 = GetReader_NoCloseConnection(con); while (sdr1.Read()) { } sdr1.Close(); Console.WriteLine("读取完毕后的连接状态:" + con.State.ToString()); Console.Read(); } finally { //确保连接被关闭 if (con.State != ConnectionState.Closed) con.Close(); } } } |