2011-09-15 53 views
0

我的應用程序拋出數據庫連接丟失錯誤。每隔一段時間連接數據庫就會丟失錯誤

我從一個教程網站得到的數據庫類,在下面,它有效,除了有時會出現上述錯誤,即時猜測它的超時,就好像使用它的人去冒煙並返回並嘗試繼續他們離開的地方。

而粗俗正常的最終用戶他們關閉然後錯誤信息那麼來讓我告訴我他們得到了一個錯誤。

但直到錯誤再次出現了,我想我會問可以改變一下這個代碼的一部分,以防止錯誤

這是火鳥數據庫服務器和C#應用

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 
using System.Windows.Forms; 
using FirebirdSql.Data.FirebirdClient; 

namespace _0912111 
{ 
    class DatabaseConnection 
    { 
     private FbConnection conn; 
     private FbCommand sqlCommand; 
     private FbDataAdapter DB; 
     private DataSet DS = new DataSet(); 

     public DatabaseConnection() 
     { 
      conn = new FbConnection("User=myuser;" + "Password=mypw;" + "Database=dbpath;" + "DataSource=serverip;" + "Port=dbport;" + "Dialect=3;" + "Charset=UTF8;"); 
     } 
     public void showDbError(string theError) 
     { 
      MessageBox.Show("Could not connect to database\n\nError Details:\n" + theError); 
     } 
     public FbConnection Openconn() 
     { 
      if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken) 
      { 
       try 
       { 
        conn.Open(); 
       } 
       catch (Exception e) 
       { 
        showDbError(e.Message.ToString()); 
       } 
      } 
      return conn; 
     } 
     public FbConnection Closeconn() 
     { 
      if (conn.State == ConnectionState.Open) 
      { 
       conn.Close(); 
      } 
      return conn; 
     } 
     public void nonQuery(string txtQuery) 
     { 
      FbCommand cmd = new FbCommand(txtQuery); 
      try 
      { 
       cmd.Connection = Openconn(); 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception Ex) 
      { 
       showDbError(Ex.Message.ToString()); 
       throw Ex; 
      } 
      finally 
      { 
       cmd = null; 
      } 
     } 
     public FbDataReader returnDataReader(string txtQuery) 
     { 
      FbCommand cmd = new FbCommand(); 
      try 
      { 
       cmd.Connection = Openconn(); 
       cmd.CommandText = txtQuery; 
       FbDataReader rd; 
       rd = cmd.ExecuteReader(); 
       return rd; 
      } 
      catch (Exception Ex) 
      { 
       showDbError(Ex.Message.ToString()); 
       throw Ex; 
      } 
      finally 
      { 
       cmd = null; 
      } 
     } 
    } 
} 

我會認爲她的代碼,說

if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken) {

將阻止它?

+0

只是檢查之前,如果conn!= null –

+0

@SenadMeškin如果conn == null我會只使用conn.Open()還是我不得不回憶一個像DatabaseConnection()一樣的新FbConnection()呢? – thegaffney

+0

您也可以在代碼中添加一些日誌記錄(對某個文件或其他任何地方),這樣即使用戶關閉對話框,也可以始終得到任何異常。 – scottm

回答

3

看,我建議你使用using和重寫以清潔的方式你的方法,沒有理由有另一種方法來打開,另一個關閉連接,我不這樣做下去了,因爲超過5年:d

也沒有理由這樣做對Ex.Message一個ToString()並且也通知,在C#中,你應該拋出只有throwthrow exc例外。

你的方法之一,將成爲這個例如:

public void nonQuery(string txtQuery) 
{ 
    using(var conn = new FbConnection(GetMyConnectionString(...parameters...))) 
    { 
     using(var cmd = new FbCommand(txtQuery)) 
     { 
      try 
      {   
       cmd.Connection = conn; 
       conn.Open(); 

       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       showDbError(ex.Message); 
       throw; 
      } 
     } 
    } 
} 
+0

好的,我把它們改掉並更新程序。這就是我得到的複製/粘貼代碼吧?哈 – thegaffney

2

我與達維德皮拉斯在這個100%。 (upvoted him)

從DatabaseConnection類中刪除「Openconn」和「Closeconn」方法。然後更改您的查詢,以便打開連接並執行命令using

數據庫驅動程序已經知道如何執行連接池。在代碼中維護一個開放的連接不僅是浪費時間,而且是您遇到問題的潛在原因。它可能導致的其他問題包括泄漏內存和打開與數據庫服務器的進一步連接的能力。

因此,重寫代碼以使用數據庫訪問的最佳實踐,問題就會消失。

+0

感謝您的確認 – thegaffney