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

Connection对象打开了一定要调用Close()方法关闭吗?



C# code

/**********************************数据库操作类***************************************/
        #region 获取学生名单
        /// <summary>
        /// 取得学生名单
        /// </summary>
        public SqlDataReader GetStudentList()
        {
            SqlConnection conn = new SqlConnection(connStr);
            try
            {
                conn.Open();

                StringBuilder sb = new StringBuilder();
                sb.AppendLine("select");
                sb.AppendLine(" [StudentNo],");
                sb.AppendLine("[StudentName] ");
                sb.AppendLine("from ");
                sb.AppendLine("[Student]");

                SqlCommand comm = new SqlCommand(sb.ToString(), conn);
                return comm.ExecuteReader();
            }
            catch (Exception)
            {
                Console.WriteLine("数据库操作失败!");
                return null;
            }
        }
/***************************************学员管理类*************************************/
        /// <summary>
        /// 查看学生名单
        /// </summary>
        public void ShowRosterList()
        {
            SqlDataReader reader = dbOperate.GetStudentList();

            if (reader == null)
            {
                Console.WriteLine("出现异常!");
                return;
            }
            Console.WriteLine("-------------------------------");
            Console.WriteLine("学号\t姓名");
            Console.WriteLine("-------------------------------");

            StringBuilder sb = new StringBuilder();
            //循环读取DataReader
            while (reader.Read())
            {
                sb.AppendFormat("{0}\t{1}",reader["StudentNo"],reader["StudentName"]);
                Console.WriteLine(sb);
                sb.Length = 0;
            }
            Console.WriteLine("--------------------------------");
            //关闭DataReader
            reader.Close();
        }



如果在catch块后面加一个finally块用来调用Close()方法关闭数据库连接,那以就reader.Read()就读取不到结果了。
刚学,感觉好思维好混乱

------解决方案--------------------
catch说明出错了,你可以关闭数据库,但其实你更应该使用事务,catch中回滚事务
------解决方案--------------------
不一定,如果程序需要长时间运行并且经常有读取写入操作,定义一个公共变量的connection,不用每次都去关闭打开,这样会浪费资源,在程序结束后再关闭就可以。如果只是在需要的时候偶尔调用一次,那就最好关闭。
------解决方案--------------------
未关闭的连接达到连接池的限制时,就会报错了,还是不要这么逆天的玩儿好
------解决方案--------------------
加上cmd.ExecuteReader(CommandBehavior.CloseConnection);

当你关闭SqlDataReader时自动关闭数据库连接,如果返回SqlDataReader就不要关闭数据库,但是要记得及时关闭SqlDataReader
------解决方案--------------------
C# code
SqlConnection conn = new SqlConnection(connStr);
            try
            {
                conn.Open();
                ...
                return comm.ExecuteReader();
            }
            catch (Exception)
            {
                Console.WriteLine("数据库操作失败!");
                return null;
            }
            finally
            {
                 comm.Close();
            }
        }

------解决方案--------------------
一般来说 用完之后就关闭,下次再用又再打开.除非你的软件只有一个人在用,就可以不关闭了,
你可以看一下 微软的数据helper 类 使用using(){} 保证每次用完关闭的
------解决方案--------------------
C# code

using(SqlConnection conn = new SqlConnection(connStr))
{
    //处理逻辑
    //推荐使用using
}

------解决方案--------------------