2016-11-08 1 views
0

Dies ist mein Code, für den ich den oben genannten Fehler beim Löschen des Turniers erhalte. Da Turnier mit einem Bild verknüpft ist, ruft der Code zuerst die ImageDeletion-Funktion und dann die Turnierzählfunktion auf, bevor das gesamte Turnier gelöscht wird.Alle Verbindungen geschlossen und immer noch "Es ist bereits ein offener DataReader mit diesem Befehl verbunden, der zuerst geschlossen werden muss"

protected void LVTournament_ItemDeleting(object sender, ListViewDeleteEventArgs e) 
{ 
    if (Session["TournId"] != null) 
    { 
     int ClubId = Convert.ToInt32(Request.Cookies["ClubDetails"]["ClubId"]); 
     int TournId = Convert.ToInt32(Session["TournId"]); 
     SqlConnection con1 = new SqlConnection(constr); 
     SqlConnection con2 = new SqlConnection(constr); 
     ImageDeletion(TournId); 
     string querydelTour = "DELETE FROM Tournaments WHERE TournamentId = @TournId"; 
     SqlCommand cmd1 = new SqlCommand(querydelTour, con1); 
     cmd1.Parameters.AddWithValue("@TournId", TournId); 
     con1.Open(); 
     cmd1.ExecuteNonQuery(); 
     con1.Close(); 
     UpdateTourCount(ClubId); 
     ClientScript.RegisterStartupScript(Page.GetType(), "Success", "<script language='javascript'>alert('Tournament Deleted...')</script>"); 
     Response.Redirect("TournamentView.aspx"); 
    } 
    else 
    { 
     ScriptManager.RegisterStartupScript(this, GetType(), "Popup", "SessionExpires();", true); 
     return; 
     } 
} 

Die Bildlöschfunktion ist

private void ImageDeletion(int TournId) 
    { 
    SqlConnection con = new SqlConnection(constr); 
    SqlCommand cmdchk = new SqlCommand("SELECT count(*) Valid FROM TournamentImages WHERE TournamentId= @TournId"); 
    cmdchk.Connection = con; 
    cmdchk.Parameters.AddWithValue("@TournId", TournId); 
    con.Open(); 
    int Count = (int)cmdchk.ExecuteScalar(); 
    for (int i = 0; i <= Count; i++) 
     { 
      string query = "SELECT ImagePath FROM TournamentImages WHERE TournamentId = @TournId"; 
      SqlCommand cmddel = new SqlCommand(query, con); 
      cmddel.Parameters.AddWithValue("@TournId", TournId); 
      SqlDataReader reader = cmddel.ExecuteReader(); 
      while (reader.Read()) 
      { 
       string FilePath = reader[0] as string; 
       string path = Server.MapPath(FilePath); 
       FileInfo file = new FileInfo(path); 
       if (file.Exists) 
        { 
        file.Delete(); 
        } 
      } 
      } 
     con.Close(); 
    } 

Und das Turnier Zählfunktion ist

protected void UpdateTourCount(int ClubId) 
{ 
    SqlConnection con = new SqlConnection(constr); 
    string Query = "UPDATE TournamentCount SET Count = Count + 1 WHERE ClubId [email protected]"; 
    SqlCommand cmd = new SqlCommand(Query, con); 
    cmd.Parameters.AddWithValue("@ClubId", ClubId); 
    con.Open(); 
    cmd.ExecuteNonQuery(); 
    con.Close(); 
    } 

ich in der Nähe haben die Verbindungen auf der Stelle und immer noch diesen Fehler Ich erhalte.

Bitte erwähnen Sie mich, wo mache ich den Fehler. Vielen Dank im Voraus

+0

Verwenden Sie die * mit * blockieren, um solche Probleme zu bewältigen. Hoffe, das hilft –

Antwort

0

Ihre Fehlermeldung sollte Ihnen einen Tipp geben, was vor sich geht. Es heißt "Es gibt bereits einen offenen DataReader ...". Du hast also die Verbindungen geschlossen, aber nicht den Leser.

Sie sollten Close Methode aufrufen, nachdem Sie Leser verwendet haben:

SqlDataReader reader = cmddel.ExecuteReader(); 
while (reader.Read()) 
{ 
    string FilePath = reader[0] as string; 
    string path = Server.MapPath(FilePath); 
    FileInfo file = new FileInfo(path); 
    if (file.Exists) 
    { 
     file.Delete(); 
    } 
} 
reader.Close(); // <- close the reader 

SqlDataReader implementiert IDisposable, so dass Sie alternativelly using Anweisung verwenden das gleiche Ergebnis zu erzielen:

using(SqlDataReader reader = cmddel.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     string FilePath = reader[0] as string; 
     string path = Server.MapPath(FilePath); 
     FileInfo file = new FileInfo(path); 
     if (file.Exists) 
     { 
      file.Delete(); 
     } 
    } 
} 
+0

Es funktioniert jetzt gut ... Ich habe gerade "reader.Close();" in die Image-Einfügefunktion eingefügt. Danke, Mann –

Verwandte Themen