如果在catch语句中发出System.Environment.Exit(0),那么在“using”块中是否关闭了OracleConnection?
示例:
OracleConnection oracleConnection = getOracleConnection();
using (oracleConnection)
{
try
{
oracleConnection.Open();
OracleCommand cmd = getApplicantsCmd(oracleConnection);
OracleDataReader rdr = cmd.ExecuteReader();
List<Applicant> applicants = new List<Applicant>();
while (rdr.Read())
{
Applicant applicant = new Applicant();
applicant.email = (string)rdr["GOREMAL_EMAIL_ADDRESS"];
applicants.Add(applicant);
}
return applicants;
}
catch (Exception ex)
{
Console.WriteLine("Failure getting applicant records: " + ex.Message);
System.Environment.Exit(0);
return null;
}
}
如果在查找记录时抛出异常,我希望执行停止。
有没有更好的方法来解决这个问题?
答案 0 :(得分:5)
未关闭与数据库的物理连接。它只是返回到ADO.NET连接池以供重用。每次要执行SQL查询时,ADO.NET都会保留一个连接池,以避免打开与数据库的物理连接。您还应将OracleCommand
和OracleDataReader
包装在using
语句中,以确保即使在发生异常时也能正确处理。
答案 1 :(得分:2)
在调用oracleConnection
后,即使变量包含在Dispose()
中,也不会调用System.Environment.Exit
的{{1}}方法。如果您想确保连接已被处理,请将using
置于using
/ try
内,或者不要在catch
内拨打System.Environment.Exit
。如果设置了标志,您仍然可以退出,并在using
语句后执行操作:
using
答案 2 :(得分:0)
是的,它确实存在,并且很快就被置于其中。
编辑:除非它被合并,并且如上所述,将再次在池中提供。
答案 3 :(得分:0)
我相信您的问题一般是,如果使用Dispose
块调用using
,是否会调用Environment.Exit
语句中使用的using
方法。< / p>
答案是否定的。如果您调用Environment.Exit
或Environment.FailFast
,则该过程将终止,并且最终阻止(隐式的,由using
语句产生)将不会被执行。
另一方面,如果您通过拨打Application.Exit
或Application.ExitThread
退出应用,则会调用该应用。