0

更新機能を機能させようとしています。txtPassword と txtConfirmPassword テキストボックスを含めました。2 つのテキスト ボックスは、更新自体の前に一致する必要がありますが、次のエラーが発生します。

ExecuteNonQuery: CommandText property has not been initialized

どうすればそれを機能させることができますか?ここに私のコードがあります:

protected void btnUpdateAccount_Click(object sender, EventArgs e)
{
    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    if (txtPassword.Text == "")
    {
        cmd.CommandText = "UPDATE Users SET EmailAddress=@EmailAddress, FirstName=@FirstName, " +
            "LastName=@LastName, Street=@Street, Municipality=@Municipality, City=@City, ZipCode=@ZipCode, ContactNo=@ContactNo, Image=@Image " +
            "WHERE UserID=@UserID";
    }
    else
    {
        if (txtConfirmPassword != txtPassword)
        {
            pnlInconsistent.Visible = true;
        }
        else
        {
            cmd.CommandText = "UPDATE Users SET Password=@Password, EmailAddress=@EmailAddress, FirstName=@FirstName, " +
                "LastName=@LastName, Street=@Street, Municipality=@Municipality, City=@City, ZipCode=@ZipCode, ContactNo=@ContactNo, Image=@Image " +
                "WHERE UserID=@UserID";
        }
        cmd.Parameters.Add("@EmailAddress", SqlDbType.NVarChar).Value = txtEmail.Text;
        cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value = Helper.CreateSHAHash(txtPassword.Text);
        cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFN.Text;
        cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLN.Text;
        //cmd.Parameters.Add("@Address", SqlDbType.NVarChar).Value = txtAddress.Text;
        cmd.Parameters.Add("@Street", SqlDbType.NVarChar).Value = txtStreet.Text;
        cmd.Parameters.Add("@Municipality", SqlDbType.NVarChar).Value = txtMunicipality.Text;
        cmd.Parameters.Add("@City", SqlDbType.NVarChar).Value = txtCity.Text;
        cmd.Parameters.Add("@ZipCode", SqlDbType.NVarChar).Value = txtZipCode.Text;
        cmd.Parameters.Add("@ContactNo", SqlDbType.NVarChar).Value = txtContact.Text;
        cmd.Parameters.Add("@UserID", SqlDbType.Int).Value = Session["UserID"].ToString();
        if (fuImage.HasFile)
        {
            cmd.Parameters.Add("@Image", SqlDbType.Text).Value = "~/images/" + fuImage.FileName;
            fuImage.SaveAs(Server.MapPath("~/images/" + fuImage.FileName));
        }
        else
        {
            cmd.Parameters.Add("@Image", SqlDbType.Text).Value = imgAvatar.ImageUrl;
        }


        if (txtPassword.Text != "")
        {
            cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value =
                Helper.CreateSHAHash(txtPassword.Text);
        }


        cmd.ExecuteNonQuery();
        con.Close();
        GetProfileInfo();

        pnlUpdated.Visible = true;
        Helper.AddLog(Session["userid"].ToString(), "Update", "Updated Profile Information");
        GetProfileInfo();
    }

}

4

2 に答える 2

0

コードは、 whereが初期化されていないcmd.ExecuteNonQuery();場合の行も実行します。txtConfirmPassword != txtPasswordCommandText

return;この場合、 の直後に を追加しpnlInconsistent.Visible = true;ます。

if (txtConfirmPassword != txtPassword)
{
    pnlInconsistent.Visible = true;
    return;
}

またはそれらすべてcmd.Parameters.Add()をラップcmd.ExecuteNonQuery();し、ネストされたelse:

else
{
    cmd.CommandText = "UPDATE Users SET Password=@Password, EmailAddress=@EmailAddress, FirstName=@FirstName, " + "LastName=@LastName, Street=@Street, Municipality=@Municipality, City=@City, ZipCode=@ZipCode, ContactNo=@ContactNo, Image=@Image " + "WHERE UserID=@UserID";
    cmd.Parameters.Add("@EmailAddress", SqlDbType.NVarChar).Value = txtEmail.Text;
    cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value = Helper.CreateSHAHash(txtPassword.Text);
    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFN.Text;
    cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLN.Text;
    //cmd.Parameters.Add("@Address", SqlDbType.NVarChar).Value = txtAddress.Text;
    cmd.Parameters.Add("@Street", SqlDbType.NVarChar).Value = txtStreet.Text;
    cmd.Parameters.Add("@Municipality", SqlDbType.NVarChar).Value = txtMunicipality.Text;
    cmd.Parameters.Add("@City", SqlDbType.NVarChar).Value = txtCity.Text;
    cmd.Parameters.Add("@ZipCode", SqlDbType.NVarChar).Value = txtZipCode.Text;
    cmd.Parameters.Add("@ContactNo", SqlDbType.NVarChar).Value = txtContact.Text;
    cmd.Parameters.Add("@UserID", SqlDbType.Int).Value = Session["UserID"].ToString();
    if (fuImage.HasFile)
    {
        cmd.Parameters.Add("@Image", SqlDbType.Text).Value = "~/images/" + fuImage.FileName;
        fuImage.SaveAs(Server.MapPath("~/images/" + fuImage.FileName));
    }
    else
    {
        cmd.Parameters.Add("@Image", SqlDbType.Text).Value = imgAvatar.ImageUrl;
    }


    if (txtPassword.Text != "")
    {
        cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value =
            Helper.CreateSHAHash(txtPassword.Text);
    }


    cmd.ExecuteNonQuery();
    con.Close();
    GetProfileInfo();

    pnlUpdated.Visible = true;
    Helper.AddLog(Session["userid"].ToString(), "Update", "Updated Profile Information");
    GetProfileInfo();
}
于 2013-07-07T08:41:11.937 に答える
0

これif (txtConfirmPassword != txtPassword)が真の場合、更新クエリは常に実行され、commandTextパラメーターはステートメントcmd.ExecuteNonQuery();の一部ではないため設定されelseません。おそらくそうあるべきです。パスワードと txtPassword と txtConfirmPassword が一致しない場合、クエリの実行を停止したいと思いますが、それが起こっているとは思いません。

また、この if-check は、txtPassword が空でない場合にのみ実行されるため、冗長に見えます。

if (txtPassword.Text != "")
        {
            cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value =
                Helper.CreateSHAHash(txtPassword.Text);
        }
于 2013-07-07T08:35:32.360 に答える