2016-01-26 2 views
0

Я создал небольшое приложение, которое запрашивает базу данных db2 и возвращает информацию. Я создал форму окна, которая принимает ввод и возвращает информацию из запроса. Мое заключительное заявление является:Закрыть SQL-соединение в форме Закрыть (C#)

finally { conn.close(); }

мне было интересно - делает соединение (Conn) на самом деле близко, когда я попал в маленькую красную коробку на форме? Я искал другие вопросы здесь и в Интернете, но не смог найти окончательного ответа.

Вот полные примерки всеобъемлющих наконец блок (с некоторой информацией запутанном -> *****):

`попробовать {

  conn.Open(); 
      string queryString = String.Format("SELECT * " + 
               "FROM ***** " + 
               "WHERE USERPRF LIKE '%{0}%' " + 
               "ORDER BY TIMESTMP DESC " + 
               "FETCH FIRST 1 ROWS ONLY", userNameInput); 

      using (OdbcCommand com = new OdbcCommand(queryString, conn)) 
      { 
       using (OdbcDataReader reader = com.ExecuteReader()) 
       { 
        if (reader.Read()) 
        { 
         string ***** = reader["*****"].ToString(); 
         string ***** = reader["*****"].ToString(); 
         string user = reader["USERPRF"].ToString(); 
         string timeStamp = reader["TIMESTMP"].ToString(); 

         listBox1.Items.Clear(); 

         listBox1.Items.Add("Username: " + user); 
         listBox1.Items.Add("*****" + *****); 
         listBox1.Items.Add("*****: " + *****); 
         listBox1.Items.Add("Last Changed: " + timeStamp); 
        } 
        else 
        { 
         listBox1.Items.Clear(); 
         listBox1.Items.Add("There was no data to return! Try again."); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      string errorMessage = ex.Message; 
     } 
     finally 
     { 
      conn.Close(); 
     }` 
+1

Если ваше приложение является единственным приложением только для одной формы, и вы закрываете приложение, соединение не будет оставаться открытым. Но вы показали как часть блока catch try, поэтому нам нужно будет увидеть полный try catch, чтобы рассказать вам, что происходит. – nabuchodonossor

ответ

3

Если соединение принадлежат приложение, то да - оно должно закрыться. Как правило, плохая практика заключается в том, чтобы оставить соединение открытым долгое время, поскольку оно представляет собой угрозу безопасности. (Кто-то может внедрить код в приложение для повторного использования на открытом соединение, чтобы сделать изворотливый материал)

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    // Stuff 
} 

Я хотел бы убедиться, что вы обрабатывать событие onClosing вашей формы окна, и сказать ему, чтобы избавиться от SqlConnection явно или, по крайней мере, попытаться это сделать. Лучше, чем сожалеть.

Примечание. Я слышал некоторые разговоры о том, что SqlConnections можно использовать в SQLConnectionPool. Если это так, вы можете изменить строку подключения, чтобы отключить или включить ConnectionPooling.

+0

Это очень полезно, спасибо за это! Я посмотрю на SQLConnectionPool - я не знаком с этим. – Smitty

+1

Вы также должны рассмотреть аудиторию своего приложения. Если вы распространяете приложение для многих людей, то, безусловно, нет прямого доступа к базе данных в приложении. Вместо этого используйте подход веб-службы и шлюза. Если это приложение будет находиться на защищенном сервере, на который никто не сможет попасть, тогда да - вы должны быть в безопасности, чтобы использовать прямой доступ к базе данных. Я бы порекомендовал держать ваши SQL соединения короткими и краткими. Когда закончите использовать базу данных, отсоедините, когда вам нужно снова подключиться - снова подключитесь. – Baaleos

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