19

最終的解決:

接続が接続プールに追加されました。それで私はそれを閉じましたが、物理的に開いたままでした。ConnectionString パラメータ "Pooling=false" または静的メソッド MySqlConnection.ClearPool(connection) および MySqlConnection.ClearAllPools を使用すると、問題を回避できます。問題は、アプリケーションを閉じたときに接続がまだ生きていたことに注意してください。閉めたのに。したがって、接続プールをまったく使用しないか、接続を閉じる前に特定のプールをクリアして問題を解決します。私の場合、何が最善の解決策であるかを時間をかけて考えます。

答えてくれてありがとう!C# の概念をよりよく理解するのに役立ち、有益な情報から多くのことを学びました。:)

===

元の問題:

しばらく検索しましたが、問題の解決策が見つかりませんでした。C# は初めてで、MySql 接続を簡単にするクラスを作成しようとしています。私の問題は、接続を開いて閉じた後です。データベースでまだ開いているため、中止されます。

もちろん、「using」ステートメントを使用していますが、接続はまだ開いており、プログラムを終了すると中断されます。

私のコードは次のようになります。

using (DatabaseManager db = new DatabaseManager())
{
using (MySqlDataReader result = db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
    foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
    {
        //Do stuff here
    }
}
}

クラス Database manager は接続を開き、破棄されると閉じます。

public DatabaseManager()
{
    this.connectionString = new MySqlConnectionStringBuilder("Server=localhost;Database=businessplan;Uid=root;");
    connect();
}
private bool connect()
{
    bool returnValue = true;
    connection = new MySqlConnection(connectionString.GetConnectionString(false));
    connection.Open();
}

public void Dispose()
{
    Dispose(true);
}

public void Dispose(bool disposing)
{
    if (disposing)
    {
        if (connection.State == System.Data.ConnectionState.Open)
        {
            connection.Close();
            connection.Dispose();
        }
    }
    //GC.SuppressFinalize(this);//Updated
}
//Updated
//~DatabaseManager()
//{
//  Dispose(false);
//}

そのため、デバッガーで確認したところ、Dispose() メソッドが呼び出され、正しく実行されました。私は何が欠けていますか?私が間違ったことや誤解したことはありますか?

どんな助けでも大歓迎です!

こんにちは、サイモン

PS: 念のため、DataReader() メソッド (更新版):

public IEnumerable<IDataReader> DataReader(String query)
    {
        using (MySqlCommand com = new MySqlCommand())
        {
            com.Connection = connection;
            com.CommandText = query;
            using (MySqlDataReader result = com.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
            {
                while (result.Read())
                {
                    yield return (IDataReader)result;
                }
            }
        }
    }

わかりました、yield リターンを使用しようとしました:

foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
    //...
}

そして、DataReader メソッドを変更しました。

public IEnumerable<IDataReader> DataReader(String query)
    {
        using (MySqlCommand com = new MySqlCommand())
        {
            com.Connection = connection;
            com.CommandText = query;
            using (MySqlDataReader result = com.ExecuteReader())
            {
                while (result.Read())
                {
                    yield return (IDataReader)result;
                }
            }
        }
    }

データを取得できるように機能しますが、まだ同じ問題があります。接続が適切に閉じられていません。:(

4

4 に答える 4

20

mysqlconnectionについてはよくわかりませんが、SQLサーバーのカウンター部分は接続プールを使用しており、closeを呼び出すと閉じず、代わりに接続プールに配置されます。

編集:Reader、Command、およびConnectionオブジェクトを必ず破棄してください。

編集:ConnectionStringパラメーター "Pooling = false"または静的メソッドMySqlConnection.ClearPool(connection)およびMySqlConnection.ClearAllPools()で解決

于 2011-04-06T14:01:23.453 に答える
5

usingCommand と DataReader もステートメントでラップする必要があります。

于 2011-04-06T13:29:05.873 に答える
-1

このようなものを使用して見てください:

private static IEnumerable<IDataRecord> SqlRetrieve(
    string ConnectionString, 
    string StoredProcName,
    Action<SqlCommand> AddParameters)
{
    using (var cn = new SqlConnection(ConnectionString))
    using (var cmd = new SqlCommand(StoredProcName, cn))
    {
        cn.Open();
        cmd.CommandType = CommandType.StoredProcedure;

        if (AddParameters != null)
        {
            AddParameters(cmd);
        }

        using (var rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
        {
            while (rdr.Read())
                yield return rdr;
        }
    }
}
于 2011-04-06T13:44:15.600 に答える