0

在我的页面中包含一个转发器并使用 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 运行丢失测试(20 个用户并运行 2 分钟)时,我在错误日志文件中收到以下错误(同样的错误不断重复)

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

这是否意味着此功能不允许多个用户同时访问它?有什么办法可以解决这个问题?

4

1 回答 1

1

如果您使用的是全局连接(例如定义为全局变量或静态变量),那么在同时运行多个线程的环境中(例如在 Web 服务器中),这将不起作用。

原因是所有线程都将通过相同的代码。第一个将打开连接,并且对所有其他连接也将保持打开状态。

最好在本地定义一个连接,一旦工作完成就打开和关闭它。

于 2013-11-07T03:59:26.817 回答