第一个问题:SqlConnection conn = new SqlConnection(connString)为什么不写在using中?
第二个问题:SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)括号内的参数是什么意思?;
第三个问题:既CommandBehavior.CloseConnection,既然在这里已经可以让conn可以随着dr的关闭而关闭了,那为什么在catch块中还要再关闭一次conn????
作者: 陈晖 时间: 2013-5-2 16:45
其实你三个问题关键就是参数——CommandBehavior.CloseConnection
conn链接会在cmd关闭之后自动关闭,
至于为什么要在catch中加关闭conn,是为了防止出错而没有关闭链接。
:)作者: 高文咪 时间: 2013-5-2 17:27
本人的理解:
SqlConnection conn = new SqlConnection(connString)只是new一个对象,放哪儿其实都无所谓,放到using里的是要与数据库进行交互进行一些操作的,可以使资源释放掉;
CommandBehavior.CloseConnection是解决在流读取数据模式下,数据库连接不能有效关闭的情况.程序在DataReader对象在生成时使用了这个,那数据库连接将在DataReader对象关闭的时候自动关闭;
CommandBehavior.CloseConnection虽然已经可以让conn关闭,但catch块中写的conn.close()为了防止出错或意外情况,程序也可以释放掉;作者: 张伟86 时间: 2013-5-3 01:50
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语句可以不需要在此出现。