0

ログインページにこのコードを書きました。私のコードにはエラーはありませんが、更新クエリはデータベースに適用されません。
最初のクエリは機能し、リダイレクトしindex.aspxますが、更新クエリ (2 番目のクエリ) は適用されません!!!!

protected void btnLogin_Click(object sender, EventArgs e)
    {
        Database db1 = new Database();
        string query = "select * from Admins where UserName=@username and cast(Password as varbinary)=cast(@password as varbinary)";
        SqlCommand smd = new SqlCommand(query, db1.sc);
        smd.Parameters.AddWithValue("@username", txtUsername.Text);
        smd.Parameters.AddWithValue("@password", General.CreatePasswordHash(txtPassword.Text));
        SqlDataReader sdr = smd.ExecuteReader();
        smd.Parameters.Clear();
        if (sdr.Read())
        {
            Session.Add("username", sdr[0].ToString());
            string nowEnter = sdr[5].ToString();
            query = "update Admins set LastEnter=@lastEnter, NowEnter=@nowEnter where UserName=@username";
            string now = General.getPersianDateNow() + " ساعت " + General.getPersianTimeNow();
            smd.CommandText = query;
            smd.Parameters.AddWithValue("@lastEnter", nowEnter);
            smd.Parameters.AddWithValue("@nowEnter", now);
            smd.Parameters.AddWithValue("@username", sdr[1].ToString());
            sdr.Close();
            smd.ExecuteNonQuery();
            Response.Redirect("~/admin/Index.aspx", false);
        }
        else
        {
            lblError.Visible = true;
        }
}
4

2 に答える 2

3

私の意見では、問題は のインデックスにありsdrます。最初に呼び出すもの

Session.Add("username", sdr[0].ToString());

あなたが使用する下の2行

 smd.Parameters.AddWithValue("@username", sdr[1].ToString());

とにかく、最も安全な方法は、名前付き列を使用する代わりに選択ステートメントを作成することです*

于 2013-05-03T21:28:33.883 に答える
0

ユーザー名に使用している値がテーブルに存在することを確認してください。

また、同じパラメーターを 2 回追加しています。SqlCommand クラスがそれをどのように処理するかはわかりませんし、今はテストできませんが、smd.Parameters.Clear()実行の合間にパラメーター ( ) をクリアすることをお勧めします。

于 2013-05-03T21:20:51.207 に答える