2016-11-08 14 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

使用して*を使用する*あなたがリーダーを使用した後

あなたはメソッドClose呼び出す必要がありますこのような問題に対処するためのブロック。これが役に立ったら –

答えて

0

あなたのエラーメッセージはあなたに何が起こっているかを教えてください。 「すでに開封済みですDataReader ...」と表示されています。あなたは接続を閉じたが、読者は閉じていない。あなたはalternativelly同じ結果を達成するために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(); // <- close the reader 

SqlDataReaderは、IDisposableが実装されています:

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();」を挿入しました。ありがとよ –

関連する問題

 関連する問題