1

このコマンドに関連付けられた開いている DataReader が既に存在し、最初に閉じる必要があります。

同じ人が別のシステムで同じページを同時に開いたときに、この問題に直面しています。私はこれについて多くのことを検索しましたが、成功した解決策は見つかりませんでした。

疲れました :

  1. MultipleActiveResultSets = true接続文字列で
  2. 接続待ち時間の増加
  3. すべての接続が閉じていることを確認

この問題は、上記の条件が作成された場合にのみ発生します。本当にうまくいく解決策を教えてください

これは私が使用している私の接続機能です

public DataSet SelectDs(string str)
{
    DataSet ds = new DataSet();

    if (con.State == ConnectionState.Closed)
    {
        con.ConnectionString = ConStr;
        con.Open();
    }

    cmd.CommandText = str;
    cmd.Connection = con;
    cmd.CommandTimeout = 12000;
    adpt.SelectCommand = cmd;
    adpt.Fill(ds);

    con.Close();
    return ds;
}
4

4 に答える 4

2

グローバル接続オブジェクトをそのように使用することは大罪です。WinForms アプリケーションでは悪い (非常に悪い) ですが、ASP.NET では致命的です。(あなたが発見したように)

使い捨てオブジェクト (および接続のような高価なもの) の使用パターンは次のとおりです。

CREATE, OPEN, USE, CLOSE, DESTROY

このパターンを簡単に使用できるようにするために、コネクション プーリングメカニズムが存在します。
代わりに、あなたはそれに反対しようとし、その結果を支払います。

コードは次のように書き直す必要があります

public DataSet SelectDs(string str)
{
    DataSet ds = new DataSet();

    using(SqlConnection con = new SqlConnection(constring))  // CREATE
    using(SqlCommand cmd = new SqlCommand(str, con))         // CREATE
    {
        con.Open();    // OPEN
        cmd.CommandTimeout = 12000;
        using(SqlAdapter adpt = new SqlAdapter(cmd))   // USE
             adpt.Fill(ds);

        return ds;
    }  // CLOSE & DESTROY 
}
于 2013-06-13T08:53:39.820 に答える
0

データセットを返す前に、コマンド オブジェクトも破棄する必要があると思います。

con.close() の後に cmd.Dispose() を試してください

于 2013-06-13T09:51:52.543 に答える