2012-02-21 3 views
1

Я получил этот код:Близко к подключению к базе данных, вызывающему здесь?

try 
{ 
    using (OracleConnection c = new OracleConnection(globalDict[byAlias(connAlias)].connString)) 
    { 
     c.Open(); 

     using (OracleCommand recordExistentQuery = new OracleCommand("regular.IsExistent", c)) 
     { 
     // here working on oraclecommand 
     } 
    } 
} catch(Exception exc) { } 

OracleConnection является класс DevArt dotConnect для Oracle. Содержит ли этот код c.Close(), когда он уходит из (OracleConnection c = new OracleConnection(globalDict[byAlias(connAlias)].connString)) { .... }?

ответ

3

Нет, он будет называть Dipose(). Блок using неявно вызывает Dispose() на объекте, указанном в операторе using.

Но часто для подключения к базе данных Dispose() обрабатывает функциональность Close(), освобождая соединение/processId, который поддерживает соединение.

0

Я хотел бы также добавить, что в случае исключения где-то в вашем //here working on oraclecommand (в основном внутри using(...){ } заявления Dispose() также будет называть.

По дизайну, вы должны быть в состоянии сделать несколько призывам к объекту, реализующему IDisposable. В вашем случае высылка вызова на Close() после вашего блока кода using будет просто ничего не делать, поскольку соединение уже закрыто/было возвращено в пул. Любые дополнительные вызовы после того, как объект был очищен должен просто возвращаться и ничего не делать.