带有using子句的SqlConnection - 在连接上调用close

时间:2012-06-21 09:16:48

标签: c# asp.net .net

当我在using子句中有一个SQLConnection,如下图所示,我是否需要显式关闭连接?

protected SqlConnection Connection 
{
    get
    {
       if (this.connection == null)
       {
           this.connection = new SqlConnection(this.ConnectionString);
       }
       if (this.connection.State != ConnectionState.Open)
       {
           this.connection.Open();
       }

       return this.connection;
    }
} 

using (SqlConnection connection = this.Connection)
{
    using (SqlCommand cmd = connection.CreateCommand())
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "....";

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                etc
            }
        }
    }
}

3 个答案:

答案 0 :(得分:3)

不,不。如果连接已经打开,连接的Dispose()方法将调用Close。

您还应该更改代码,因为John Gathogo建议每次需要时创建一个新的连接对象。您的代码将失败,因为第二次尝试使用连接时,它将被处理掉。

ADO.NET使用连接池来保持一个打开的连接池,它为调用Open的人提供。这意味着只要池中有可用连接,创建和打开新连接就不会花费任何成本。保持连接打开时间超过必要时间会降低性能。

答案 1 :(得分:3)

using块始终会调用Dispose,这将关闭连接。

但是,您保留了连接对象并打算重用它,这在处理后是不可能的。您不应该保留连接对象,您应该将其丢弃并在需要时创建一个新对象。与数据库的实际连接是池化的,因此当您创建新的连接对象时,它将重用池中的一个连接。处理连接对象时,实际连接将返回到池中。

答案 2 :(得分:1)

您可以轻松地将代码更改为以下内容并实现您的目标:

   using (SqlConnection connection = new SqlConnection(this.ConnectionString))
   {
      connection.Open();
      using (SqlCommand cmd = connection.CreateCommand())
      {
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = "....";

         using (SqlDataReader reader = cmd.ExecuteReader())
         {
            while (reader.Read())
            {
               //etc
            }
         }
      }
   }

运行时将负责关闭连接并为您配置资源