2012-10-10 4 views
1

В блоке «using» используется OracleConnection, если System.Environment.Exit (0) выдается в выводе catch?В блоке «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

Возможно, у вас есть пустой улов, а после использования сделайте 'Environment.Exit (0); return null; ', так как если бы он не возвращался до сих пор, он наверняка не завершил блок try. – SimpleVar

+0

Вы также можете поместить использование внутри блока try вместо обертывания вокруг него. – SimpleVar

+0

@YoryeNathan, который является наилучшей практикой, ставит использование вокруг try или try вокруг использования? Я видел сообщения, делающие это в обоих направлениях. – Baxter

ответ

2

Там не будет никакого вызова метода Dispose()oracleConnection «s После зову System.Environment.Exit, даже если переменная завернутые в using. Если вы хотите убедиться, что соединение установлено, либо поместите using внутри try/catch, либо не вызывайте System.Environment.Exit внутри 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);     
} 
+0

Насколько я знаю, соединение закрывается автоматически, когда приложение выходит в любом случае, даже без какого-либо конкретного закрытия или удаления. – Nyerguds

5

Физическое подключение к базе данных не закрывается. Он просто возвращается в пул соединений ADO.NET для повторного использования. ADO.NET поддерживает пул соединений, чтобы не открывать физическое подключение к базе данных каждый раз, когда вы хотите выполнить SQL-запрос. Вы также должны обернуть свои OracleCommand и OracleDataReader в операторы using, чтобы обеспечить надлежащее удаление даже в случае исключения.

0

Да, оно есть и расположено в нем слишком коротко после этого.

EDIT: если он не объединен, и, как объяснено, снова будет доступен в пуле.

0

Я считаю, что ваш вопрос в целом, является ли Dispose метод объекта, используемого в using заявление будет называться, если Environment.Exit вызывается с using блоком.

Ответ отрицательный. Если вы вызываете Environment.Exit или Environment.FailFast, процесс завершается и, наконец, блок (неявный, полученный в результате инструкции using) не будет выполнен.

С другой стороны, если вы покинете свое приложение, позвонив по телефону Application.Exit или Application.ExitThread, он будет называться.