我有以下代码:
using (SqlCommand command = new SqlCommand())
{
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Connection = new SqlConnection();
command.CommandText = "";
command.Parameters.Add(new SqlParameter("@ExperienceLevel", 3).Direction = System.Data.ParameterDirection.Input);
SqlDataReader dataReader = command.ExecuteReader();
}
在声明SqlConnection的地方是否有任何功能影响我目前正在声明它而不是这样?:
using (SqlCommand command = new SqlCommand())
using (SqlConnection connection = new SqlConnection())
由于
答案 0 :(得分:5)
是的,有区别。处置SqlCommand
不会自动处理与其关联的SqlConnection
。您可以通过这种方式泄漏连接,它会干扰ADO.NET连接池;如果您在此代码运行时查看数据库服务器的活动,您将看到新连接被打开但未关闭。
您应始终使用第二个版本。事实上,SqlConnection
对象是您真正需要到Dispose
的对象。你应该尽快处理实现IDisposable
的任何,但是没有处置SqlConnection
是特别危险的。
答案 1 :(得分:3)
是的,最好使用2个块,每个资源1个。
在这种情况下,您只能使用1,但它应该在Connection周围,而不是在Command周围。
但你真的不想知道或关心这些细节。如果一个类实现了IDispsoable接口,那么在using() { }
块中使用它的实例,除非有特殊原因不这样做。
答案 2 :(得分:2)
我使用以下模式:
using(var connection = new SqlConnection("ConnectionName"))
using(var command = new SqlCommand())
{
command.Connection = connection;
// setup command
var reader = command.ExecuteReader();
// read from the reader
reader.Close();
}
答案 3 :(得分:0)
是的,下面的代码会正确配置SqlConnection,上面的代码不会。 using
块(在内部实现为try
... finally
)确保无论您如何退出块,都将处置该对象。