Pregunta

En mi página, consiste en un repetidor y vincule algunos datos utilizando el procedimiento de almacenamiento de SQL Server 2008.

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

Enlace de datos 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;

Esta es la SQLConnection que será compartida entre toda la aplicación.

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

Simplemente lee todos los datos del lector de datos y asignó a una colección personalizada y vuelve al repetidor.

Todo funciona bien cuando pruebo solo. Pero cuando ejecuto la prueba perdida usando Visual Studio (20 usuarios y ejecuto durante 2 minutos), recibí errores a continuación en mi archivo de registro de errores (el mismo error se repite)

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

¿Significa que esta función no permitió que múltiples usuarios acceda al mismo tiempo? ¿Alguna forma de resolver esto?

¿Fue útil?

Solución

Si está utilizando una conexión global (por ejemplo, definida como una variable global o una variable estática), eso no funcionará en un entorno en el que tenga múltiples hilos que se ejecuten al mismo tiempo (por ejemplo, en un servidor web).

La razón por la razón es que todos los hilos pasarán por el mismo código. El primero abrirá la conexión y permanecerá abierto para todos los demás también.

Es mejor definir una conexión localmente, abrirla y cerrarla tan pronto como se haga el trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top