在“使用”块中是关闭的OracleConnection



在"using"块中,如果在catch语句中发出System.Environment.Exit(0),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;
            }
        }

如果在查找记录时抛出异常,我希望执行停止。

有没有更好的方法来解决这个问题?

与数据库的物理连接未关闭。它只是返回到 ADO.NET 连接池以供重用。ADO.NET 保留一个连接池,以避免每次要执行 SQL 查询时打开与数据库的物理连接。您还应该将OracleCommandOracleDataReader包装在using语句中,以确保即使在发生异常时也能正确处置。

在调用 System.Environment.Exit 之后不会调用 oracleConnectionDispose() 方法,即使变量被包装在 using 中。如果要确保连接已处置,请将using放在try/catch内,或者不要在using内调用System.Environment.Exit。如果您设置了一个标志,您仍然可以退出,并在 using 语句之后对其执行操作:

var mustExit = false;
using (var oracleConnection = getOracleConnection()) {
    try {
        ...
    } catch {
        Console.WriteLine("Failure getting applicant records: " + ex.Message);    
        mustExit = true;
    }
}
if (mustExit) {
    System.Environment.Exit(0);                
}

是的,它是,并且不久之后就被处理掉了。

编辑:除非它被池化,并且如前所述,它将再次在池中可用。

我相信

你的问题是,如果在块中调用Environment.Exit,是否会调用using语句中使用的对象的Dispose方法using

答案是否定的。如果调用 Environment.ExitEnvironment.FailFast ,则进程将终止,最终阻止(隐式阻止,由语句using产生)将不会执行。

另一方面,如果通过调用 Application.ExitApplication.ExitThread 退出应用,则会调用它。

相关内容

  • 没有找到相关文章

最新更新