1

ユーザーが古いパスワードを置き換えるために新しいパスワードを入力した m/s アクセス データベースのテーブルを更新したかったのですが、更新ステートメントに構文エラーがあります。助けてください!

public partial class resetPassword : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected void SubmitButton_Click(object sender, EventArgs e)
        {
            string userName = (string) Session["username"];

        string str = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\inetpub\wwwroot\JetStar\database\JetstarDb.accdb";
        var con = new OleDbConnection(str);
        con.Open();

        string pwd = Request.Form["conPassword"];
        OleDbCommand cmd = new OleDbCommand("UPDATE [users] SET password = '" + pwd + "' WHERE username = '" + userName + "'", con);

        try
        {
            cmd.ExecuteNonQuery();
            MessageBox.Show("Your password has been changed successfully."); 
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        finally
        {
            con.Close();
        }
    }
}
4

2 に答える 2

4

はMicrosoft Accessの予約済みキーワードpasswordであるため、おそらくこれが発生します。次のように角かっこで使用する必要があります[password]

しかし、もっと重要なこと

パラメータ化されたクエリを常に使用する必要があります。この種の文字列連結は、SQL インジェクション攻撃に対してオープンです。

パスワードを平文で保存しないでください。読む:データベースにパスワードを保存する最良の方法

usingステートメントを使用して、 OleDbConnectionandを破棄しますOleDbCommand

using(OleDbConnection con = new OleDbConnection(str))
using(OleDbCommand cmd = con.CreateCommand())
{
    cmd.CommandText = "UPDATE [users] SET [password] = ? WHERE username = ?";
    cmd.Parameters.Add("pass", OleDbType.VarChar).Value = pwd;
    cmd.Parameters.Add("user", OleDbType.VarChar).Value = userName;
    con.Open();
    try
    {
        cmd.ExecuteNonQuery();
        MessageBox.Show("Your password has been changed successfully."); 
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
    }
}
于 2014-12-11T08:34:02.790 に答える
2

DB の問題の92.3% (a)は、使用する前にコマンドを出力してエラー メッセージを読むだけで明らかになります。

したがって、次のように置き換えます。

OleDbCommand cmd = new OleDbCommand("UPDATE [users] SET password = '" + pwd + "' WHERE username = '" + userName + "'", con);

次のようなもので:

String s = "UPDATE [users] SET password = '" + pwd + "' WHERE username = '" + userName + "'";
Console.WriteLine(s);
OleDbCommand cmd = new OleDbCommand(s, con);

次に、次の結果を投稿します。

Response.Write(ex.Message);

すべての人に見てもらい、それがあなたに伝えていることを非常に注意深く調べてください。


(a)どこからともなく引っ張ってきた統計 - 実際の値は大きく異なる可能性があります。

于 2014-12-11T08:35:18.457 に答える