2016-11-08 50 views
0

这是我在尝试删除锦标赛时遇到上述错误的代码。由于锦标赛与图像相关联,因此在删除整个锦标赛之前,代码首先调用ImageDeletion函数,然后调用锦标赛计数函数。关闭所有连接,仍然会出现“已经有一个与此命令关联的打开的DataReader,必须先关闭”

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

的图像删除功能

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(); 
    } 

而且比赛计数功能

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(); 
    } 

我有密切的联系,然后和那里,还是我得到这个错误。

请问我在哪里犯错。在此先感谢

+0

使用*使用*阻止像这样的问题。希望这可以帮助 –

回答

0

您的错误消息应该给你一个小费是怎么回事。它说:“已经有一个开放的DataReader ...”。所以你已经关闭了连接,但不是读者。

你应该调用方法Close你已经使用读卡器后:

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实现IDisposable,这样你就可以alternativelly使用using语句来实现相同的结果:

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

它现在工作正常...我刚刚插入“reader.Close();”图像插入功能。谢谢你,小伙伴 –

相关问题