Domanda

Nella mia pagina è costituita da un ripetitore e vincola alcuni dati utilizzando la procedura Store da SQL Server 2008.

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

Binding Data 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;

Questa è la Connezione SQL che sarà condivisa tra l'intera applicazione.

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

Ha appena letto tutti i dati del lettore di dati e assegna una raccolta personalizzata e passa al ripetitore.

Tutto funziona bene quando provo da solo. Ma quando eseguo il test smarrito usando Visual Studio (20 utenti ed eseguo 2 minuti), ho ricevuto errori di seguito nel mio file di registro degli errori (stesso errore continua a ripetere)

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 che questa funzione non ha permesso a più utente di accedervi contemporaneamente? Qualche modo per risolverlo?

È stato utile?

Soluzione

Se stai utilizzando una connessione globale (ad esempio definita come una variabile globale o una variabile statica), che non funzionerà in un ambiente in cui si dispone di più thread in esecuzione contemporaneamente (ad esempio in un server Web).

Il motivo è che tutti i thread passano attraverso lo stesso codice. Il primo aprirà la connessione e rimarrà aperto anche per tutti gli altri.

È meglio definire una connessione a livello locale, aprirla e chiuderla non appena il lavoro è finito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top