我在登录页面写了这段代码。我的代码没有任何错误,但更新查询不适用于我的数据库
拳头查询工作,我重定向到index.aspx
但更新查询(第二个查询)不适用!!!!
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;
}
}
答案 0 :(得分:3)
在我看来,问题是索引为sdr
。你调用的第一个
Session.Add("username", sdr[0].ToString());
您使用以下两行
smd.Parameters.AddWithValue("@username", sdr[1].ToString());
无论如何,最安全的方法是创建带有命名列的select语句,而不是使用*
答案 1 :(得分:0)
检查表中是否存在用于用户名的值。
您还要添加两次相同的参数。我不知道SqlCommand类将如何处理它,我现在无法测试它,但我认为在执行之间清除参数(smd.Parameters.Clear()
)可能是个好主意。