Frage

In meiner Seite besteht aus einem Repeater und binden Sie einige Daten mithilfe der Store -Prozedur von SQL Server 2008.

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

Datenbindung 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;

Dies ist die SQLConnection, die unter der gesamten Anwendung teilnehmen wird.

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

Es wurde gerade alle Daten von Data Reader durchlesen und eine benutzerdefinierte Sammlung zugewiesen und an den Repeater zurückgibt.

Alles funktioniert gut, wenn ich alleine teste. Wenn ich den verlorenen Test jedoch mit Visual Studio (20 Benutzer und 2 Minuten lang ausführte) ausführe, habe ich in meiner Fehlerprotokolldatei unten Fehler erhalten (gleiche Fehler halten Wiederholung).

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

Bedeutet dies, dass diese Funktion mehreren Benutzern nicht gleichzeitig zugänglich gemacht hat? Wie kann man dies lösen?

War es hilfreich?

Lösung

Wenn Sie eine globale Verbindung verwenden (z. B. definiert als globale Variable oder statische Variable), funktioniert dies nicht in einer Umgebung, in der mehrere Threads gleichzeitig ausgeführt werden (z. B. in einem Webserver).

Der Grund dafür ist, dass alle Threads denselben Code durchlaufen. Der erste öffnet die Verbindung und bleibt auch für alle anderen offen.

Es ist am besten, eine Verbindung vor Ort zu definieren, zu öffnen und zu schließen, sobald der Job erledigt ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top