首页 新闻 会员 周边 捐助

关于SqlConnection连接,关闭的问题

0
悬赏园豆:10 [已解决问题] 解决于 2008-08-31 10:29
<P>这是微软petshop 4.0中的两个方法:</P> <P>&nbsp;public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand cmd = new SqlCommand();</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int val = cmd.ExecuteNonQuery();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Parameters.Clear();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return val;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P> <P mce_keep="true">&nbsp;</P> <P>private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (conn.State != ConnectionState.Open)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Connection = conn;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.CommandText = cmdText;</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (trans != null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Transaction = trans;</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.CommandType = cmdType;</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cmdParms != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (SqlParameter parm in cmdParms)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Parameters.Add(parm);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P> <P>&nbsp;没有关闭连接,测试了下,我调用ExecuteNonQuery后,连接还是打开的,是不是故意这么设计,还是什么原因</P>
999999999999999的主页 999999999999999 | 初学一级 | 园豆:3
提问于:2008-08-27 11:28
< >
分享
最佳答案
0
因为是外部传入的SqlConnection,他不确定你是否需要这个连接继续开着,所以没关闭,设计使然 你要他自动关闭,应该传一个string作为连接字符串进去,这样的话他会自己开个conn,然后标记一个似乎叫mustClose的变量为true,到时候就会关了
Gray Zhang | 专家六级 |园豆:17610 | 2008-08-27 11:33
其他回答(6)
0
SqlConnection 不要用全局或静态或单例模式 否则会出现不同进程进下OpenCLose混乱
重典 | 园豆:2442 (老鸟四级) | 2008-08-27 11:49
0
一楼正解
玉开 | 园豆:8822 (大侠五级) | 2008-08-27 12:19
0
在PetShop 4.0中的SqlHelper类中,提供了对ExecuteNonQuery方法的多个版本重载,你上面所说的这个方法,因为连接是从外部传入的,所以,SqlHelper不确定外部是否还需要这个连接(比如外部需要保持事务),所以它不能Close。并不是所有的ExecuteNonQuery方法都不关闭连接。
TerryLee | 园豆:3300 (老鸟四级) | 2008-08-27 12:34
0
TerryLee正解。 如果你想在使用ExecuteNonQuery方法之后自动关闭Connection,看下下面的: 你看下ExecuteNonQuery好像有一个参数重载,它能够关闭与之相关联的Connection对象。(我快俩月没接触过C#了,记得是可以的)。
是谁啊? | 园豆:339 (菜鸟二级) | 2008-08-27 12:49
0
请综合一四楼:) 具体要不要关,看自己的需求了
zjy | 园豆:3194 (老鸟四级) | 2008-08-27 14:12
0
你看外面调用的部分,调用完这个方法后,会有一个关闭连接的操作。
H2O、winnerzone | 园豆:205 (菜鸟二级) | 2008-08-27 17:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册