1

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

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

有没有更好的方法来处理这个?

4

4 回答 4

5

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

于 2012-10-10T14:30:02.077 回答
2

在调用 之后不会调用oracleConnectionDispose()方法System.Environment.Exit,即使变量被包装在using. 如果你想确保连接被释放,要么放在using里面try/ catch,或者不要调用System.Environment.Exitinside using。如果您设置了一个标志,您仍然可以退出,并在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);                
}
于 2012-10-10T14:38:34.740 回答
0

是的,它是,并且在不久之后就被放置在其中。

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

于 2012-10-10T14:30:27.197 回答
0

我相信您的问题一般是如果调用withing块,是否会调用语句Dispose中使用的对象方法。usingEnvironment.Exitusing

答案是不。如果你调用Environment.Exitor Environment.FailFast,进程将终止并且 finally 块(隐含的,由using语句产生)将不会被执行。

另一方面,如果您通过调用退出您的应用程序,Application.Exit否则Application.ExitThread它将被调用。

于 2012-10-10T14:45:08.483 回答