2

アプリケーション全体で再利用する MySqlConnection オブジェクトを持つクラスがあります

public class MySqlWrapper : IDbConnection
{
    MySqlConnection _connection = new MySqlConnection();
}

私はこれを使用していくつかの方法を持っています

public void UseDB()
{
    _connection.Open();  
    // Do highly important stuff  
    _connection.Close();
}

接続が既に開かれているため、Open() 呼び出しが失敗することがあります。
はい、すべての Open() に対応する Close() があります

今私が見つけた解決策は、接続を使用するたびに接続を複製することです

    MySqlConnection connClone = _connection.Clone();
    connClone.Open();

何らかの理由で、このスニペットは悪いコードのにおいがします。安全に使用できますか?open/close を処理するために私が知らない別の方法はありますか?

4

2 に答える 2

4

で接続がすでに開かれているかどうかを確認できます_connection.ConnectionState == ConnectionState.Open

IDisposableDispose メソッドで MySqlConnection を実装して破棄し、コンストラクター (または初期化メソッド) 内で接続を初期化することをお勧めします。その後、ConnectionState を使用して、クエリを実行する前に接続を再初期化する必要があるかどうかを判断できます。

各クエリ間で接続/切断しないでください。非常に遅くなります。

于 2011-02-11T22:50:52.923 に答える
3

おそらく、そのクラスを少しリファクタリングして、各メソッドで使用するたびに MySqlConnection をインスタンス化することを検討してください。

C# のusingステートメントも考慮してください。

using (var myConn = new MySqlConnection())
{      
    myConn.Open();
    //do some work.
}
//the MySqlConnection is now out of scope.

それが実行可能なオプション/リファクタリングでない場合は、 と の両方を独自のブロックにラップすることを検討.Open()してください.Close()try catch

于 2011-02-11T22:47:33.893 に答える