在“使用”块中,OracleConnection已关闭

时间:2012-10-10 14:28:38

标签: c# try-catch exit using oraclecommand

如果在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;
            }
        }

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

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

4 个答案:

答案 0 :(得分:5)

未关闭与数据库的物理连接。它只是返回到ADO.NET连接池以供重用。每次要执行SQL查询时,ADO.NET都会保留一个连接池,以避免打开与数据库的物理连接。您还应将OracleCommandOracleDataReader包装在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.ExitEnvironment.FailFast,则该过程将终止,并且最终阻止(隐式的,由using语句产生)将不会被执行。

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