2016-07-21 6 views
-1

私はテキストボックスのために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"); 
} 
+0

'rdr = cmd.ExecuteReader();'の 'rdr'はまだ開いているので、最初に閉じておく必要があります。 – CodeCaster

+1

'IDisposable'を実装するすべてのもの、' SqlCommand'と 'SqlDataReader'に' using'ステートメントを使用してください。 –

+0

DataReader rdrは基本的にCustomerテーブル(DataReaderはデータベースに接続されているオブジェクト)にアクセスしています。 rdrを閉じるまでCustomerテーブルを変更してください。 代わりに、DataReaderはDataSetとループスルー行を使用します。事はうまくいくはずです。 – DipakRiswadkar

答えて

0

です。あなたのデータを読んだら、あなたは読者を処分しなければなりません:

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

エラーは自明です。 whileループの後でデータリーダーを閉じてください。 rdr.close(); しかし、良い練習として、usingステートメントを使用して、データリーダーまたは接続を終了してください。

関連する問題