2016-01-26 186 views
0

我創建了一個查詢db2數據庫並返回信息的小應用程序。我創建了一個接受輸入並從查詢中返回信息的窗體。我的總結陳詞是:關閉窗體關閉SQL連接(C#)

finally { conn.close(); }

我很好奇 - 不連接(康涅狄格州)實際上接近時,我打窗體上的小紅盒子?我在這裏和網上搜索了其他問題,但無法找到明確的答案。

下面是完整的try-catch-finally塊(有一些信息模糊 - > *****):

`嘗試 {

  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

如果你的應用程序是一個單一的窗體應用程序,並關閉你的應用程序,conn將明確不會保持打開狀態。但是您將其作爲try catch塊的一部分展示,因此我們需要查看完整的try catch來告訴您發生了什麼。 – nabuchodonossor

回答

3

如果連接是由擁有應用程序,那麼是的 - 它應該關閉。 將連接保持長時間打開通常是不好的做法,因爲它構成安全風險。 (有人可能會注入代碼到你的應用程序重用打開連接,做狡猾的東西)

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

我會確保你處理你的Windows窗體的onClosing事件,並告訴它處置的SqlConnection的明確地,或者至少試圖這樣做。 比對不起更安全。

注意 - 我聽說過一些關於SqlConnections可以在SQLConnectionPool中共享的討論。如果是這種情況,您可以修改連接字符串以禁用或啓用ConnectionPooling。

+0

這非常有啓發性,謝謝!我將看看SQLConnectionPool - 我不熟悉這一點。 – Smitty

+1

你也應該考慮你的應用程序的觀衆。 如果您將應用程序分發給很多人,那麼在應用程序中絕對不能直接訪問數據庫。而應使用Web服務和網關方法。 如果這個應用程序將在一個安全的服務器上,沒有人可以得到,那麼是的 - 你應該安全地使用直接訪問數據庫。我仍然建議保持你的SQL連接簡明扼要。完成使用數據庫後,請在需要再次連接時斷開連接 - 重新連接。 – Baaleos