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");
}
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
Verwenden Sie die 'using'-Anweisung für alles, was' IDisposable' implementiert, hier für die Verbindung, 'SqlCommand' und' SqlDataReader' –
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