【问题标题】:Closed all connections and still getting "There is already an open DataReader associated with this Command which must be closed first"关闭所有连接,仍然得到“已经有一个打开的 DataReader 与此命令关联,必须先关闭”
【发布时间】:2016-11-08 05:18:03
【问题描述】:

这是我在尝试删除锦标赛时收到上述错误的代码。由于锦标赛与图像相关联,因此代码首先调用 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();
  }

我当时和那里都关闭了连接,但我仍然收到此错误。

请指出我在哪里犯了错误。提前致谢

【问题讨论】:

  • 使用 using 块来处理这样的问题。希望这会有所帮助

标签: c# sql connection database-connection sqldatareader


【解决方案1】:

您的错误消息应该告诉您发生了什么。它说“已经有一个打开的 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,因此您也可以使用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();
        }
    }
}

【讨论】:

  • 现在可以正常工作了...我刚刚将“reader.Close();”插入到图像插入函数中。谢谢老哥
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
相关资源
最近更新 更多