我是否通过将其放在“使用”块中来正确关闭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”块时也将它们丢弃?
答案 0 :(得分:0)
using
块实际上是语法糖,因为它具有一个try
/ finally
块,该块调用正在作用的对象的Dispose
方法,但不会不管在哪里创建对象。
对于SqlConnection
对象,调用Dispose
将关闭连接。来自the docs:
如果SqlConnection超出范围,则不会关闭它。因此,您必须通过调用
Close
或Dispose
明确关闭连接。 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块也将强制关闭连接。