2017-02-14 2 views
0

Grundsätzlich, wenn ich diesen Code ausführen, bekomme ich die folgende Fehlermeldung und ich weiß nicht, wie es zu lösen. Ich erhalte diesen Fehler, wenn ich auf die Schaltfläche klicke, dann werde ich mit dem folgenden Fehler zurück zu Visual Studio weitergeleitet. Bitte helfen Sie mir, diesen Fehler zu lösen, Hilfe wird geschätzt.A { „Es gibt bereits eine offene Datareader mit diesem Befehl zugeordnet, der zuerst geschlossen werden muss.“}

Mit diesem Befehl ist bereits ein offener DataReader verbunden, der zuerst geschlossen werden muss.

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' Methode automatisch' open' Verbindung, und vor, dass Sie sollten 'Close' vorherige Verbindung. –

+0

[SQL-Injection-Warnung] (http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - Sie sollten ** nicht ** Ihre SQL-Anweisungen verketten - verwenden ** parametrisierte Abfragen ** statt SQL Injection zu vermeiden –

+0

Warum bearbeiten Sie Ihren Code? –

Antwort

0

Zu der Zeit, die Sie versuchen, Fill auszuführen, ist die Verbindung con bereits damit beschäftigt, Daten abzurufen, um die SqlDataReader glücklich zu halten. Eine Datenbankverbindung kann immer nur eine Ergebnismenge verarbeiten.

Sie haben zwei Möglichkeiten:

  1. initialisieren updates mit einer zweiten Datenbank Verbindungsinstanz, so dass Sie zwei zur gleichen Zeit geöffnet haben.
  2. Verwenden Sie reader, um das vollständige Resultset zuerst zu erhalten und es in einem Array oder DataTable zu speichern. Wenn Sie mit dem Reader fertig sind, durchlaufen Sie das Array/die Tabelle und führen die Aktualisierungen für reg.
+0

können Sie bitte bearbeiten Sie den Code bitte mit der ersten Option – umrktk

+0

Ich habe versucht, Ihre zweite Möglichkeit der Fehler verschwunden kaufen, warum ist der Benutzer auf Video newpass.Visible = true; confpass.Visible = wahr; und etc .. wenn die if-Anweisung nicht erfüllt ist, weil ich den username.text = username, Sicherheitsfragen zu Datenbanksicherheit Fragen gleich zu sein. Wenn diese Bedingungen erfüllt sind, sollte der Inhalt in der if-Anweisung angezeigt werden – umrktk

1

Sie erhalten diesen Fehler, weil Sie Daten Leser verschachtelt sind. Hier ist der Code, vereinfacht, um zu zeigen, was Sie tun:

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

Um das zu tun, müssen Sie MARS ermöglichen. Sie können in Ihrer Verbindungszeichenfolge tun so:

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

Natürlich können Sie, dass nur ein Beispiel ist, müssen Sie Ihre eigene Verbindungszeichenfolge verwenden.

1

der Fehler gesagt, dass Sie DataReader geöffnet haben und Sie eröffnet eine weitere SqlDataAdapter vor DataReader schließen. In .Net müssen Sie also den ersten Befehl schließen, um einen neuen Befehl zu öffnen.

Änderung dieser:

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

zu

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