Должна ли функция использоваться в блоке try, который должен быть выполнен в блоке finally - PullRequest
1 голос
/ 08 июля 2010
try
{
  OpenConnection();
  RowsAffected = cmd.ExecuteNonQuery(); 
  CloseConnection(true); //should I use this function call here 
  //as well, when I am using it in finally 
  //block. For closing database connection.
}
catch (SqlException ex)
{ throw ex; }
finally
{ CloseConnection(true); }

Или я должен написать это так

try
{
  OpenConnection();
  RowsAffected = cmd.ExecuteNonQuery(); 
}
catch (SqlException ex)
{ throw ex; }
finally
{ CloseConnection(true); }

Ответы [ 4 ]

8 голосов
/ 08 июля 2010

Нет, блок finally всегда выполняется независимо от успеха или неудачи кода в блоке try. В вашем первом примере соединение будет закрыто дважды в случае успеха.

Вы говорите, что проверяете состояние соединения, поэтому вы не получаете исключения при повторном закрытии соединения. Тем не менее, я думаю, что более уместно пытаться закрыть его только при необходимости.

1 голос
/ 08 июля 2010

В этом конкретном примере вы можете сделать это:

using (var conn = new SqlConnection(...)) {
    // Do work
}

То, что компилятор делает с этим утверждением, по существу:

SqlConnection conn;
try {
  conn = new SqlConnection(...)
} finally {
  conn.Dispose();
}

Или около того ... блок finally всегда выполняется, гарантируя, что блок using всегда вызывает Dispose.

Недостатком этого подхода является то, что вы не можете поймать исключение SqlException, которое может быть сгенерировано, поэтому в итоге вы делаете что-то вроде этого:

try {
  using (var conn = new SqlConnection(...)) {
    // Do work.
  }
} catch (SqlException ex) {

}

Но скомпилированный код в конечном итоге представляет:

try {
  SqlConnection conn;
  try {
    conn = new SqlConnection(...);
  } finally {
    conn.Dispose();
  }
} catch (SqlException ex) {

}

Если честно, то, вероятно, это не будет иметь никакого значения для производительности, так как всякий раз, когда вы выбрасываете исключение, оно будет ударом по производительности. Это гарантирует, что Dispose всегда вызывается.

0 голосов
/ 08 июля 2010

Вы должны написать вторым способом

                try 
                { 
                    OpenConnection(); 
                    RowsAffected = cmd.ExecuteNonQuery();  
                } 
                catch (SqlException ex) 
                { throw ex; } 
                finally 
                { CloseConnection(true); }
0 голосов
/ 08 июля 2010

Ваш блок finally всегда выполняется. Используя функции Close, такие как Dispose (), CLose () следует использовать в блоке finally

...