使用using语句的SqlConnection - 在连接上调用close方法

3

当我在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
            }
        }
    }
}

1
不要重复使用连接对象,一旦调用Dispose方法,它将会失败。 - Panagiotis Kanavos
3个回答

3

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

正如John Gathogo所建议的那样,您应该在每次需要连接时都创建一个新的连接对象。否则您的代码会出现问题,因为当您尝试第二次使用连接时,它已经被处理了。

ADO.NET使用连接池来维护一组开放的连接,并提供给调用Open方法的人。这意味着只要连接池中有可用的连接,创建和打开新连接就不需要任何成本。保持连接打开时间过长将降低性能。


是的,“using”块结束时,它会自动调用connection.Dispose()。Dispose显式调用connection.Close()等其他操作。请参见http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open.aspx。 - AJM

3
using 块将始终调用 Dispose,以关闭连接。 但是,您正在保留连接对象并打算重复使用它,一旦它被处理,这是不可能的。您不应保留连接对象,而应在需要时将其丢弃并创建新的连接对象。实际的数据库连接是池化的,因此当您创建新的连接对象时,它将重用池中的一个连接。当您处理连接对象时,实际连接将返回到池中。

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

运行时会自动关闭连接并处理资源的释放


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接