当我在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
}
}
}
}
答案 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
}
}
}
}
运行时将负责关闭连接并为您配置资源