我可以有效地使用这种方法吗?
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块时调用)是否会关闭底层的SqlConnection对象?
不,处置SqlCommand
不会影响连接.更好的方法是将for包装SqlConnection
在一个使用块中:
using (SqlConnection conn = new SqlConnection(connstring)) { conn.Open(); using (SqlCommand cmd = new SqlCommand(cmdstring, conn)) { cmd.ExecuteNonQuery(); } }
否则,由于正在使用它的Command被处理掉(也许这就是你想要的?),Connection就不会改变.但请记住,连接也应该被处理掉,并且处理命令可能比命令更重要.
编辑:
我刚试过这个:
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可以(重新)使用相同的SqlConnection.将重点放在SqlConnection上.