2013-12-10 2 views
2

Я хотел спросить, что является обычным способом использования соединений с базой данных и их закрытия.Убедитесь, что соединение закрыто

Это моя программа, но я вижу в exeption, connection.Close() не будет выполняться.

Должен ли я использовать try-catch для всего блока? потому что по какой-то причине я вижу, что большинство людей этого не делает.

using (SqlConnection connection = new SqlConnection(ConnectionString)) 
     { 
      using (SqlCommand command = new SqlCommand()) 
      { 
       command.CommandText = "procedure"; 

       command.Connection = connection; 

       command.CommandType = CommandType.StoredProcedure; 

       tmpParameter = DBUtils.createInSQLParam("@ImageID", SqlDbType.SmallInt, htmlImageId); 
       command.Parameters.Add(tmpParameter); 

       command.Connection.Open(); 

       using (SqlDataReader reader = command.ExecuteReader()) 
       { 
        htmlImageDetails = GetHtmlImageDetailsFromReader(reader, true, out newId); 

        reader.Close(); 
       } 

       connection.Close(); 

       return htmlImageDetails; 
      } 
     } 
+0

Какое исключение вы видите? –

+0

Это похоже на ваш вопрос - http://stackoverflow.com/a/4717802/978528. – nickfinity

+0

Закрытие не требуется при использовании «использования» соединений/считывателей автоматически закрываются. .net использует пул соединений по умолчанию, поэтому соединение не закрывается, если вы его размещаете, оно помещается в пул для повторного использования (это улучшает производительность в большинстве случаев). – Peter

ответ

5

Вы не должны делать это явно, потому что ваш SqlConnection экземпляр всегда будет расположен (а затем, соединение закрыто) благодаря using синтаксический сахар.

2

Должен ли я использовать Try-фиксатор для всего блока? потому что по какой-то причине я вижу, что большинство людей этого не делает.

No. Поскольку вы используете using заявление, что приводит к try-finally блока, так что даже если исключение происходит это обеспечит удаление объекта.

using Statement (C# Reference)

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

SqlConnection.Dispose гарантирует, что соединение будет закрыто.

Чтобы убедиться, что соединения всегда закрыты, открыть соединение внутри using блока, ....... Это гарантирует, что соединение автоматически закрывается, когда код выходит из блока.

2

Вы открываете соединение с блоком using, а это значит, что компилятор удостоверится, что на соединение вызывается Dispose(), который вызывается Close(). Поэтому, чтобы не волноваться, вам не нужно подключаться самостоятельно, даже в случае Exception.

Смежные вопросы