2011-09-15 18 views
0

毎回、アプリケーションがデータベースへの接続を失いました。データベースへの接続を取得すると、エラーが発生しました。

データベースクラス私はチュートリアルサイトから入手したものですが、上記のエラーを除いて素晴らしいことがあります。タイムアウトを推測しています。使用している人が煙が出て戻ってきて彼らが中断したところで続ける。

通常のエンドユーザが粗くなっているとエラーメッセージが表示され、その後エラーメッセージが表示されます。

しかし、エラーが、私は、私は、これはFirebirdのDBサーバとAC#アプリケーション

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の私はちょうどconn.Openを(使用している場合、もしCONN!= nullを –

+0

@SenadMeškin前に確認してください)または私はDatabaseConnection(のような新しいFbConnectionを()リコールしなければならないのでしょうか? – thegaffney

+0

また、コードにいくつかのロギングを追加することもできます。これにより、ユーザーがダイアログを閉じても常に例外が発生します。 – scottm

答えて

3

私はusingを使用して、あなたのメソッドをよりクリーンな方法で書き直すことをお勧めします。別のメソッドを開く必要はなく、もう1つは接続を閉じるために、私はもう5年以上使用していません。D

ToString()Ex.Messageに送信する理由もありません。また、C#では、throwではなくthrow 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

ああ、それらを変えて、プログラムを更新してください。それは私がコピー/貼り付けのコードのために得る何ですか? Hah – thegaffney

2

私はこれについてDavide Pirasと100%です。 (彼にupvoted)

DatabaseConnectionクラスから "Openconn"と "Closeconn"メソッドを削除します。次に、クエリを変更して、接続のオープンとコマンドの実行の文をusingにします。

データベースドライバは、すでに接続プーリングの実行方法を知っています。コードでオープンな接続を維持することは、時間の無駄ではなく、経験しているような問題の潜在的な原因です。それが引き起こす可能性のあるその他の問題は、メモリリークとデータベースサーバとのさらなる接続を開く機能です。

データベースアクセスのベストプラクティスを使用するようにコードを書き直すと、問題はなくなります。

+0

確認していただきありがとうございます – thegaffney

関連する問題