A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵威 中级黑马   /  2013-5-2 16:39  /  2922 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        /// <summary>
        /// ExecuteReader()方法——返回多行多列
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] parameters)
        {
           //定义连接变量conn
            SqlConnection conn = new SqlConnection(connString);
            //定义操作变量cmd
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                conn.Open();
                if (parameters != null)
                {
                    cmd.Parameters.AddRange(parameters );
                }
                try
                {
                    //定义一个dr去接收cmd.ExecuteReader()方法返回的数据
                    SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    return dr;
                }
                catch (Exception ex)
                {
                    conn.Close();
                    throw ex;
                }
            }
        }

第一个问题:SqlConnection conn = new SqlConnection(connString)为什么不写在using中?
第二个问题:SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)括号内的参数是什么意思?;
第三个问题:既CommandBehavior.CloseConnection,既然在这里已经可以让conn可以随着dr的关闭而关闭了,那为什么在catch块中还要再关闭一次conn????

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

5 个回复

倒序浏览
其实你三个问题关键就是参数——CommandBehavior.CloseConnection
conn链接会在cmd关闭之后自动关闭,
至于为什么要在catch中加关闭conn,是为了防止出错而没有关闭链接。
:)
回复 使用道具 举报
本人的理解:
SqlConnection conn = new SqlConnection(connString)只是new一个对象,放哪儿其实都无所谓,放到using里的是要与数据库进行交互进行一些操作的,可以使资源释放掉;
CommandBehavior.CloseConnection是解决在流读取数据模式下,数据库连接不能有效关闭的情况.程序在DataReader对象在生成时使用了这个,那数据库连接将在DataReader对象关闭的时候自动关闭;
CommandBehavior.CloseConnection虽然已经可以让conn关闭,但catch块中写的conn.close()为了防止出错或意外情况,程序也可以释放掉;

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
1、这个表达式不写在using里面的原因再看了第2点和第3点之后会清楚。
2、CommandBehavior是一个枚举类型,CloseConnection是其中的一个值,CommandBehavior.CloseConnection代表在执行ExecuteReader命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。而CommandBehavior.CloseConnection的产生的原因就在于也就是楼上说那样解决了流读取数据模式下,数据库连接不能有效关闭的情况。而在本例中使用的最主要原因是 如果使用SqlDataReader dr = cmd.ExecuteReader() ,则return ds之后,要显示加上conn.Close();而使用SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection),就不需要我们再去显示调用Close了。
3、在catch块中显示调用Close是为了保证在调用语句SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection) 之前的过程出现了问题,conn可以正常Close而使用的。
所以,第1个问题的答案应该是使用了SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)实现正常数据库的关闭操作,使用catch块中的conn.Close()实现异常状态下的conn关闭操作,就代替了using语句自动管理数据库功能,所以using语句可以不需要在此出现。








回复 使用道具 举报
第一个问题:为何要用using?只要是实现了IDispose接口的均要使用using.
第三个问题:若没有执行try{},那么就会执行catch{}此时需要关闭连接。
回复 使用道具 举报
第一个问题:using 的作用就是在using的内容中没有任何外部引用的时候交给C#的GC(GarbageCollection)来进行回收。本例中可以放在using 也可以不放,因为在代码的所有可能路径中都有conn.close()这个方法。
第二个问题:CommandBehavior.CloseConnection解决了流读取数据模式下,数据库连接不能有效关闭的情况.当某个XXXDataReader对象在生成时使用了CommandBehavior.CloseConnection,那数据库连接将在XXXDataReader对象关闭时自动关闭.
第三个问题:try catch代码段中catch到的异常有可能会在SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);代码执行前发生。如果发生的异常导致程序中断,那么如果没有catch段代码的话,资源就不会被释放掉。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马