3

我有以下代码:

    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())

谢谢

4

4 回答 4

5

是的,有区别。处置SqlCommand不会自动处置SqlConnection与之关联的 。您可以通过这种方式泄漏连接,它会干扰 ADO.NET 连接池;如果您在此代码运行时查看数据库服务器的活动,您将看到新连接正在打开而不是关闭。

您应该始终使用第二个版本。事实上,SqlConnection对象是您真正需要的对象Dispose。您应该始终尽快处置任何实现的东西,但不处置 a特别危险。IDisposableSqlConnection

于 2010-03-24T21:22:10.477 回答
3

是的,最好使用 2 个使用块,每个资源 1 个。

在这种情况下,您可以只使用 1,但它应该在 Connection 周围,而不是在 Command 周围。

但你真的不想知道或关心这些细节。如果一个类实现了 IDispsoable 接口,则在块中使用它的实例,using() { }除非有特殊原因不这样做。

于 2010-03-24T21:22:31.037 回答
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();
}
于 2010-03-24T21:28:03.817 回答
0

是的,下面的代码将正确处理 SqlConnection,上面的代码不会。using块(在内部实现为... tryfinally确保无论您如何退出块,对象都会被释放。

于 2010-03-24T21:21:08.817 回答