SqlCommand.Dispose是否closures连接?
我可以有效地使用这种方法吗?
using(SqlCommand cmd = new SqlCommand("GetSomething", new SqlConnection(Config.ConnectionString)) { cmd.Connection.Open(); // set up parameters and CommandType to StoredProcedure etc. etc. cmd.ExecuteNonQuery(); }
我关心的是:SqlCommand的Dispose方法(在退出using块时调用)是否会closures底层的SqlConnection对象?
不,处理SqlCommand
不会影响连接。 一个更好的方法是将SqlConnection
包装在一个使用块中:
using (SqlConnection conn = new SqlConnection(connstring)) { conn.Open(); using (SqlCommand cmd = new SqlCommand(cmdstring, conn)) { cmd.ExecuteNonQuery(); } }
否则,连接是不变的,事实上,使用它的命令被处置(也许这是你想要的?)。 但请记住,连接也应该被处置,而且可能比命令更重要。
编辑:
我刚刚testing过这个:
SqlConnection conn = new SqlConnection(connstring); conn.Open(); using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 1", conn)) { Console.WriteLine(cmd.ExecuteScalar().ToString()); } using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 2", conn)) { Console.WriteLine(cmd.ExecuteScalar().ToString()); } conn.Dispose();
第一个命令在使用模块退出时处理。 这个连接还是开放的,对于第二个命令来说是好的。
所以,处置命令绝对不会处理它正在使用的连接。
SqlCommand.Dispose是不够的,因为许多SqlCommand(s)可以(重新)使用相同的SqlConnection。 把焦点集中在SqlConnection上。
我使用这种模式。 我有这个私人的方法在我的应用程序的某个地方:
private void DisposeCommand(SqlCommand cmd) { try { if (cmd != null) { if (cmd.Connection != null) { cmd.Connection.Close(); cmd.Connection.Dispose(); } cmd.Dispose(); } } catch { } //don't blow up }
然后,我总是在try块中创buildSQL命令和连接(但不包含在使用块中),并始终有一个finally块:
finally { DisposeCommand(cmd); }
连接对象是命令对象的一个属性,在这种情况下使得使用块变得尴尬 – 但是这种模式可以完成工作而不会混淆代码。