如果连接来自静态类,SQL连接是否以“使用”关闭?

时间:2018-11-13 22:40:59

标签: c# asp.net .net sql-server ado.net

我是否通过将其放在“使用”块中来正确关闭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());
}

我正在“ using”块内打开连接,我认为连接也会被关闭,因为它是在“ using”块内打开的。但是,由于“新SqlConnection”对象实际上是从外部类生成的,因此我的连接是否仍被适当关闭? SQL Server显示该连接仍处于打开状态,但是我不确定这是否是ADO.NET连接池回收/共享,或者该连接是否真正保持打开状态。我没有在“使用”块内的连接上显式调用.Close()。

我是否还需要显式关闭SqlCommand和SqlDataReader对象,还是在我们离开“ using”块时也将它们丢弃?

2 个答案:

答案 0 :(得分:0)

using块实际上是语法糖,因为它具有一个try / finally块,该块调用正在作用的对象的Dispose方法,但不会不管在哪里创建对象。

对于SqlConnection对象,调用Dispose将关闭连接。来自the docs

  

如果SqlConnection超出范围,则不会关闭它。因此,您必须通过调用CloseDispose明确关闭连接。 Close和Dispose在功能上是等效的。

答案 1 :(得分:0)

是的,一旦失去作用域,它将关闭连接。 样本:

try
{
    SqlConnection sqlConn = new SqlConnection("myConnectionString");
    sqlConn.Open();
    ...
}
finally
{
   sqlConn.Close();
}

此代码将由编译器转换为以下代码:

function copyDailyreport() {
var timeStamp=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy");

var sheetFrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MSM");
var sheetTo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MSM Daily Totals");
var valuesToCopy = sheetFrom.getRange(4, 11, sheetFrom.getLastRow(), 1).getValues();

//convert the column to a row
valuesToCopy=valuesToCopy.join('*#*');
valuesToCopy=valuesToCopy.split('*#*');

//add timestamp in the first place in the row
valuesToCopy.unshift(timeStamp)

//add the row to destination sheet
sheetTo.appendRow(valuesToCopy);

}

您可以看到 finally 块中调用了 close()。 即使在运行期间在 using 块中出现异常,此finally块也将强制关闭连接。