2016-07-21 3 views
-1

Ich versuche, eine einfache Kontenregisterseite mit requiredvalidator für Textfelder und comparevalidator, um das Passwort zu bestätigen.Warum erhalte ich den Fehler "Es ist bereits ein offener Datenleser vorhanden, der zuerst geschlossen werden muss"?

die Validatoren funktionieren gut.

Wenn ich die richtigen Daten in der richtigen Format eingefügt, erhalte ich einen Fehler „bereits offen Datareader zugeordnet ist, der zuerst geschlossen werden muss“ Warum ist es so? Wie repariere ich es?

hier sind meine C# Codes

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data.SqlClient; 
public partial class register : System.Web.UI.Page 
{ 
static readonly string scriptErrorUserId = 
"<script language=\"javascript\">\n" + 
"alert (\"Error - Username you keyed in is taken up, please key in another Username\");\n" + 
"</script>"; 

static readonly string scriptSuccessNewAccount = 
"<script language=\"javascript\">\n" + 
"alert (\"Your account has been succesfully created - Thank You!\");\n" + 
"</script>"; 

protected void Page_Load(object sender, EventArgs e) 
{ 

} 
protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    SqlConnection mDB = new SqlConnection(@"Data Source=iipproject.database.windows.net;Initial Catalog=IIP Project;Integrated Security=False;User ID=beatrice135;Password=Tompel1997;Encrypt=False;TrustServerCertificate=False"); 

    mDB.Open(); 
    Type csType = this.GetType(); 
    // check to ensure that UserId keyed in is not being in used by other Customers 
    SqlCommand cmd; 
    SqlDataReader rdr; 
    string strSQLSelect = "SELECT cUsername FROM Customer ORDER BY cUsername"; 
    cmd = new SqlCommand(strSQLSelect, mDB); 
    rdr = cmd.ExecuteReader(); 

    while (rdr.Read() == true) 
    { 
     if (txtUsername.Text == (string)rdr["cUsername"]) 
     { 
      ClientScript.RegisterStartupScript(csType, "Error", scriptErrorUserId); 
      mDB.Close(); 
      return; 
     } 
    } 
    // insert new record 
    string strSQLInsert = "INSERT INTO " 
     + " Customer (cUsername, cPassword, cFirstName, cLastName, cAddress, cEmail, cPhone,cTitle,cGender,cPostalCode,cBirthDate)" 
     + " VALUES (@username,@pw,@fn,@ln,@add,@email,@phone,@title,@gender,@postcode,@birthdate)"; 

    cmd = new SqlCommand(strSQLInsert, mDB); 
    cmd.Parameters.AddWithValue("@uid", txtUsername.Text); 
    cmd.Parameters.AddWithValue("@pw", txtPassword.Text); 
    cmd.Parameters.AddWithValue("@fn", txtFirstName.Text); 
    cmd.Parameters.AddWithValue("@add", txtAddress.Text); 
    cmd.Parameters.AddWithValue("@email", txtEmail.Text); 
    cmd.Parameters.AddWithValue("@phone", txtPhone.Text); 
    cmd.Parameters.AddWithValue("@ln", txtLastName.Text); 
    cmd.Parameters.AddWithValue("@birthdate", txtBirthDate); 
    cmd.Parameters.AddWithValue("@postcode", txtPostalCode.Text); 
    cmd.Parameters.AddWithValue("@title", ddlTitle.SelectedItem.Text); 
    cmd.Parameters.AddWithValue("@gender", ddlGender.SelectedItem.Text); 
    cmd.ExecuteNonQuery(); 
    mDB.Close(); 
    ClientScript.RegisterStartupScript(csType, "Success", scriptSuccessNewAccount); 

    // prepare Session variables for newly registered customer 
    Session["sFlag"] = "T"; 
    Session["sUsername"] = (string)txtUsername.Text; 
    Session["sFirstName"] = (string)txtFirstName.Text; 
    Session["sAddress"] = (string)txtAddress.Text; 
    Session["sEmail"] = (string)txtEmail.Text; 
    Session["sPhone"] = (string)txtPhone.Text; 
    Response.Redirect("default.aspx"); 
} 
+0

Weil 'rdr' aus' rdr = cmd.ExecuteReader(); 'noch offen ist und zuerst geschlossen werden muss, was der Fehler und Ihre Recherche dafür hätte anzeigen sollen. – CodeCaster

+1

Verwenden Sie die 'using'-Anweisung für alles, was' IDisposable' implementiert, hier für die Verbindung, 'SqlCommand' und' SqlDataReader' –

+0

Grundsätzlich greift Ihr DataReader rdr auf die Customer-Tabelle zu (DataReader ist mit der Datenbank verbunden) Modifizieren Sie die Customer-Tabelle, bis Sie rdr geschlossen haben. In Ihrem Fall DataReader DataSet verwenden und Zeilen durchschleifen; Dinge sollten funktionieren. – DipakRiswadkar

Antwort

0

Ich glaube, der Fehler selbsterklärend ist. Nach dem Lesen Ihrer Daten müssen Sie das Lesegerät entsorgen:

... 
while (rdr.Read() == true) 
    { 
     if (txtUsername.Text == (string)rdr["cUsername"]) 
     { 
      ClientScript.RegisterStartupScript(csType, "Error", scriptErrorUserId); 
      mDB.Close(); 
      return; 
     } 
    } 
rdr.Close(); 
... 
0

Der Fehler ist selbsterklärend. Schließen Sie den Datenleser nach der while-Schleife. rdr.close(); Als eine gute Praxis, verwenden Sie bitte using Anweisung, die sich um das Schließen des Datenlesers oder der Verbindung kümmern wird.

Verwandte Themen