Правильный способ закрыть соединение с базой данных в случае исключения

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

Я использую компактную версию Microsoft SQL.

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();
}

Ответы

Ответ 1

Как вы обрабатываете 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.

EDIT: Это то же самое, что и

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

Ответ 2

Используйте Using

using(SqlConnection conn = new SqlConnection())
{
//put all your code here.
}

Ответ 3

try
catch
finally

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

Ответ 4

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

Ответ 6

Вам нужно попробовать следовать по пути. Поскольку Connection Close In finally Block

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
}