質問

私のページでは、リピーターで構成されており、SQL Server 2008のストア手順を使用してデータをバインドしています。

rptTour.DataSource = GetData();
rptTour.DataBind();

データバインディングgetData()

SqlCommand cmdSelectAllMatch = new SqlCommand("sp_sel_Tour", Global.conn);
    SqlDataReader dtrSelectAllMatch = null;
    Collection<TourBO> TourData = new Collection<TourBO>();

    try
    {
        Global.connD2W.Open(); //error here, line 23
        cmdSelectAllMatch.CommandType = System.Data.CommandType.StoredProcedure;
        dtrSelectAllMatch = cmdSelectAllMatch.ExecuteReader();

        while (dtrSelectAllMatch.Read())
        {
            TourBO Tour = new TourBO();
            TourID = Convert.ToInt16(dtrSelectAllMatch[dtrSelectAllMatch.GetOrdinal("ID")]);
            Tour.Name = dtrSelectAllMatch[dtrSelectAllMatch.GetOrdinal("Name")].ToString();


            TourData.Add(Tour);
        }
    }
    catch(Exception ex)
    {
        Global.Log(ex.ToString());
    }
    finally
    {
        Global.connD2W.Close();            
    }

    if (dtrSelectAllMatch != null)
    {
        dtrSelectAllMatch.Close();
    }
    return TourData;

これは、アプリケーション全体で共有されるSQLConnectionです。

public static SqlConnection connD2W = new SqlConnection(ConfigurationManager.ConnectionStrings["D2WConnectionString"].ConnectionString);

データリーダーのすべてのデータを読み取り、カスタムコレクションに割り当ててリピーターに渡すだけです。

私が自分でテストするとき、すべてが正常に機能します。しかし、Visual Studioを使用してLost Testを実行すると(20人のユーザー20人)、エラーログファイルで以下のエラーを受け取りました(同じエラーを繰り返し続けます)

Log Entry : 9:59:05 AM Thursday, November 07, 2013
:System.InvalidOperationException: The connection was not closed. The connection's current state is connecting.
at System.Data.ProviderBase.DbConnectionBusy.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at TourDAL.GetAllScheduledMatch() in c:\Documents\Visual Studio 2010\WebSites\test\App_Code\DAL\TourDAL.cs:line 23

この関数は、複数のユーザーが同時にアクセスできるようにしないことを意味しますか?これを解決する方法はありますか?

役に立ちましたか?

解決

グローバル接続(グローバル変数または静的変数として定義されているなど)を使用している場合、複数のスレッドが同時に実行されている環境(Webサーバーで)で動作しません。

その理由は、すべてのスレッドが同じコードを通過するためです。最初のものは接続を開き、他のすべてのためにも開いたままになります。

接続をローカルで定義し、ジョブが完了したらすぐに開閉するのが最善です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top