私はテキストボックスのためにrequiredvalidatorとパスワードを確認するためにcomparevalidatorと簡単なアカウントの登録ページを作ろうとしています。「最初に閉じなければならないデータリーダーは既に開いています」というエラーが表示されるのはなぜですか?
バリデーターは正常に動作します。
正しい形式で正しいデータを挿入すると、エラーが発生しました 「既に開いているDataReaderが関連付けられていますが、最初に閉じる必要があります」 なぜですか?どうすれば修正できますか?ここ
は、私のC#のコードは、私はエラーが自明であると考えてい
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");
}
'rdr = cmd.ExecuteReader();'の 'rdr'はまだ開いているので、最初に閉じておく必要があります。 – CodeCaster
'IDisposable'を実装するすべてのもの、' SqlCommand'と 'SqlDataReader'に' using'ステートメントを使用してください。 –
DataReader rdrは基本的にCustomerテーブル(DataReaderはデータベースに接続されているオブジェクト)にアクセスしています。 rdrを閉じるまでCustomerテーブルを変更してください。 代わりに、DataReaderはDataSetとループスルー行を使用します。事はうまくいくはずです。 – DipakRiswadkar