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); } 

连接对象是命令对象的一个​​属性,在这种情况下使得使用块变得尴尬 – 但是这种模式可以完成工作而不会混淆代码。