Pergunta

Na minha página, consiste em um repetidor e vincule alguns dados usando o procedimento de armazenamento do SQL Server 2008.

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

Ligação de dados 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 é a SQLConnection que será compartilhada entre todo o aplicativo.

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

Acabou de ler todos os dados do Data Reader e atribuir a uma coleção personalizada e passar de volta ao repetidor.

Tudo funcionando bem quando eu testo sozinho. Mas quando eu execute o teste perdido usando o Visual Studio (20 usuários e execute por 2 minutos), recebi erros abaixo no meu arquivo de log de erros (o mesmo erro, mantenha a repetição)

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

Isso significa que essa função não permitiu que vários usuários a acessassem ao mesmo tempo? Alguma maneira de resolver isso?

Foi útil?

Solução

Se você estiver usando uma conexão global (por exemplo, definida como uma variável global ou uma variável estática), isso não funcionará em um ambiente em que você possui vários threads em execução ao mesmo tempo (por exemplo, em um servidor da Web).

O motivo disso é que todos os threads passarão pelo mesmo código. O primeiro abrirá a conexão e ele permanecerá aberto para todos os outros também.

É melhor definir uma conexão localmente, abri -la e fechá -la assim que o trabalho for feito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top