Bigprey Ответов: 1

Закрыл все соединения и все еще получаю “уже есть открытый datareader, связанный с этой командой, который должен быть закрыт первым”


Это мой код, для которого я получаю вышеупомянутую ошибку при попытке удалить турнир. Поскольку турнир связан с изображением, код сначала вызывает функцию ImageDeletion, а затем функцию подсчета турниров, прежде чем удалить весь турнир.

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 =@ClubId";
  SqlCommand cmd = new SqlCommand(Query, con);
  cmd.Parameters.AddWithValue("@ClubId", ClubId);
  con.Open();
  cmd.ExecuteNonQuery();
  con.Close();
  }


Я закрыл соединения тогда и там, и все еще получаю эту ошибку.

Будьте добры, скажите мне, где я совершаю ошибку. Заранее спасибо

Что я уже пробовал:

Я пробовал давать каждому соединению разные имена, а также
MultipleActiveResultSets=True;
.

Ни один из них не работает.

1 Ответов

Рейтинг:
6

Mehdi Gholam

Попробуйте закрыть устройство чтения данных ImageDeletion():

...
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();// <- add this line
...


PIEBALDconsult

Еще лучше использовать оператор using для соединений, команд и считывателей.
И, возможно, обеспечить командное поведение.Тесная связь с читателем.
https://msdn.microsoft.com/en-us/library/system.data.commandbehavior(v=против 110). aspx