2017-02-14 14 views
0

基本的にこのコードを実行すると、次のエラーが発生し、解決方法がわかりません。ボタンをクリックするとこのエラーが表示され、Visual Studioにリダイレクトされて次のエラーが表示されます。私はこのエラーを解決するのを助けてください、助けに感謝します。A {"このコマンドに関連付けられた開いているDataReaderがあり、最初に閉じる必要があります。"}

このコマンドに関連付けられている開いているDataReaderが既にあります。これは最初に閉じる必要があります。

public partial class forgot : System.Web.UI.Page 
{ 
    protected void resetpass_Click(object sender, EventArgs e) 
    { 
     SqlDataReader reader = null; 

     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString); 
     con.Open(); 

     SqlCommand cmd = new SqlCommand("select * from reg where Username [email protected]", con); 
     cmd.Parameters.AddWithValue("@username", username.Text); 
     cmd.Parameters.AddWithValue("@security1", sec1.Text); 
     cmd.Parameters.AddWithValue("@security2", sec2.Text); 

     reader = cmd.ExecuteReader(); 

     if (reader != null && reader.HasRows) 
     { 
      newpass.Visible = true; 
      confpass.Visible = true; 
      Label1.Text = "New Password"; 
      Label2.Text = "Confirm New Password"; 

      SqlDataAdapter updates = new SqlDataAdapter("update reg set Password='" + newpass.Text + "'", con); 

      DataSet ds = new DataSet(); 
      updates.Fill(ds); 

      ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('The Password has been Changed')</script>"); 
      con.Close(); 
     } 
    } 
} 
+0

'Fill'方法が自動的に' open'接続、およびあなたは 'Close'前回接続する必要があることの前に:この

変更。 –

+0

[SQL Injection alert](http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - SQLステートメントを連結しない** ** ** SQL注入を避けるために、代わりにパラメータ化されたクエリ** –

+0

あなたのコードを編集しているのはなぜですか? –

答えて

0

Fillを実行しようとすると、接続conはすでにデータを取得しようとして忙しく、SqlDataReaderを満足させます。データベース接続は、一度に1つの結果セットしか処理できません。あなたが同時に2つが開いていますので、2番目のデータベース接続インスタンスと

  1. 初期化updates

    は、2つのオプションがあります。

  2. readerを使用して、最初に完全な結果セットを取得し、配列またはDataTableに格納します。次に、リーダーで作業が完了したら、アレイ/テーブルを繰り返して、regへの更新を実行します。
+0

あなたは最初のオプションでコードを編集してください。 – umrktk

+0

私はあなたの2番目の方法を試しましたが、エラーが消えてしまった理由をユーザーにビデオnewpass.Visible = true; confpass.Visible = true; username.text = usernameが必要なのでifステートメントが満たされていないとき、セキュリティの質問はデータベースのセキュリティの質問と等しくなるようにします。これらの条件が満たされると、if文の内容を表示する必要があります – umrktk

1

あなたはデータの読者を入れ子にしているので、あなたはそのエラーを取得しています。ここにあなたのコードは、あなたが何をしているかを示すために、単純化されている:

protected void resetpass_Click(object sender, EventArgs e) { 
    // Here is data reader 
    SqlDataReader reader = null; 
    // ... 
    reader = cmd.ExecuteReader(); 
    if(reader != null && reader.HasRows) { 
     // ... 
     // and here is another one within the above data reader 
     SqlDataAdapter updates = new SqlDataAdapter("update reg set Password='" + newpass.Text + "'", con); 
    } 
} 

をことを行うには、MARSを有効にする必要があります。あなたは、接続文字列で行うことができます。もちろん

Server=.\SQLEXPRESS;Database=master;Integrated Security=SSPI; 
    MultipleActiveResultSets=true; 

おそれは一例であり、あなた自身の接続文字列を使用する必要があります。

1

エラーは、DataReaderを開いていて、あなたがDataReaderを閉じる前に、別のSqlDataAdapterを開いたことを言いました。だから.Netでは、新しいコマンドを開くために最初のコマンドを閉じる必要があります。

if (reader != null && reader.HasRows) 
     { 
      newpass.Visible = true; 
      confpass.Visible = true; 
      Label1.Text = "New Password"; 
      Label2.Text = "Confirm New Password"; 
      SqlDataAdapter updates = new SqlDataAdapter("update reg set Password='" + newpass.Text + "'", con); 
      DataSet ds = new DataSet(); 
      updates.Fill(ds); 
      ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('The Password has been Changed')</script>"); 
      con.Close(); 
     } 

if (reader != null && reader.HasRows) 
     { 
      reader.Close(); 
      newpass.Visible = true; 
      confpass.Visible = true; 
      Label1.Text = "New Password"; 
      Label2.Text = "Confirm New Password"; 
      SqlDataAdapter updates = new SqlDataAdapter("update reg set Password='" + newpass.Text + "'", con); 
      DataSet ds = new DataSet(); 
      updates.Fill(ds); 
      ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('The Password has been Changed')</script>"); 
      con.Close(); 
     } 
関連する問題

 関連する問題