Правильный способ закрыть соединение с базой данных в случае исключения - PullRequest
15 голосов
/ 21 апреля 2010

Оставляет ли следующий код соединение открытым, если есть исключение?

Я использую базу данных Microsoft SQL Compact Edition.

try
{
    SqlCeConnection conn = new SqlCeConnection(ConnectionString);

    conn.Open();

    using (SqlCeCommand cmd =
        new SqlCeCommand("SELECT stuff FROM SomeTable", conn))
    {
      // do some stuff
    }

    conn.Close();
}
catch (Exception ex)
{
    ExceptionManager.HandleException(ex);
}

Конечно, лучшим способом было бы объявить объект подключения перед попыткой, установить соединение внутри блока try и закрыть его в блоке finally?

 SqlCeConnection conn = null;
 try
 {
    conn = new SqlCeConnection(ConnectionString);

    conn.Open();

    using (SqlCeCommand cmd =
        new SqlCeCommand("SELECT stuff FROM SomeTable", conn))
    {
      // do some stuff
    }
}
catch (Exception ex)
{
    ExceptionManager.HandleException(ex);
}
finally
{
    if( conn != null )  conn.Close();
}

Ответы [ 6 ]

29 голосов
/ 21 апреля 2010

То, как вы обрабатываете SqlCeCommand в своем коде с помощью блока using, вы можете сделать то же самое для SqlCeConnection.

SqlCeConnection conn;
using (conn = new SqlCeConnection(ConnectionString))
{
   conn.Open();
   using (SqlCeCommand cmd = 
       new SqlCeCommand("SELECT stuff FROM SomeTable", conn))
   {
   // do some stuff
   }
}

Примечание. Блок using можно использовать для классов, реализующих IDisposable.

РЕДАКТИРОВАТЬ: Это то же самое, что и

try
{
    conn = new SqlCeConnection(ConnectionString);
    conn.Open();

    SqlCeCommand cmd = conn.CreateCommand();
    cmd.CommandText = "...";

    cmd.ExecuteNonQuery();
}
finally
{
    conn.Close();
}

ref: http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection%28VS.80%29.aspx

8 голосов
/ 21 апреля 2010

Использование Using

using(SqlConnection conn = new SqlConnection())
{
//put all your code here.
}
4 голосов
/ 21 апреля 2010
try
catch
finally

- правильный способ справиться с этим, потому что соединение всегда должно быть закрыто в конце. но вы должны проверить не только это conn != null, но также если conn состояние не Closed.

0 голосов
/ 13 декабря 2017

Вы должны попробовать следующий путь. Потому что соединение закрывается в конечном блоке

try
{
    SqlCeConnection conn = new SqlCeConnection(ConnectionString);

    conn.Open();

    using (SqlCeCommand cmd =
        new SqlCeCommand("SELECT stuff FROM SomeTable", conn))
    {
      // do some stuff
    }
}
catch (Exception ex)
{

}
finally
{
\\close connection here
}
0 голосов
/ 21 апреля 2010

Вы должны использовать оператор using, который обрабатывает закрытие соединения без проблем http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

0 голосов
/ 21 апреля 2010

Почему бы не использовать использование вокруг соединения, а также команду?

...