【发布时间】:2019-04-16 20:26:52
【问题描述】:
我是否通过将 SQL 连接放置在“使用”块中来正确关闭它?
这就是我获取新连接、执行查询并返回结果的方式:
using (SqlConnection objCS = DB.LMSAdminConn())
{
objCS.Open();
SqlCommand objCommand = new SqlCommand("SELECT TOP 1 * FROM users WHERE userid = @userid", objCS);
objCommand.Parameters.Add("@userid", SqlDbType.Int).Value = userid;
SqlDataReader reader = objCommand.ExecuteReader();
while (reader.Read())
{
//do something
}
reader.Close();
}
连接本身来自这个调用:
public static SqlConnection LMSAdminConn()
{
return new SqlConnection(ConfigurationManager.ConnectionStrings["lmsadmin"].ToString());
}
我正在“使用”块内打开连接,我认为连接也会关闭,因为它是在“使用”块内打开的。但是由于“新的 SqlConnection”对象实际上是从外部类生成的,我的连接是否仍然被适当地关闭? SQL Server 显示连接仍处于打开状态,但我不确定这是否是 ADO.NET 连接池回收/共享,或者连接是否真正保持打开状态。我没有在“使用”块内的连接上明确调用 .Close()。
我是否还需要显式关闭 SqlCommand 和 SqlDataReader 对象,或者当我们离开“使用”块时它们也被释放?
【问题讨论】:
-
using语句不知道也不关心对象“来自”什么。它将处置其对象。 -
当
using块终止时,它们将被关闭和处置。你可以阅读文档here。 -
Using 语句将在上述情况下处理您的连接。
-
您应该对(几乎)所有实现
IDisposable并且您没有在非局部变量中维护引用的对象使用using语句。所以是的,把你的SqlCommand和SqlDataReaders 也放在那里。
标签: c# asp.net .net sql-server ado.net