我的更新查询不适用于数据库
我在我的登录页面中编写了此代码。我的代码没有任何错误,但更新查询不适用于我的数据库。
拳头查询工作,我重定向到index.aspx
但更新查询(第二个查询)不适用!我的更新查询不适用于数据库
protected void btnLogin_Click(object sender, EventArgs e)
{
Database db1 = new Database();
string query = "select * from Admins where [email protected] 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 [email protected], [email protected] where [email protected]";
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;
}
}
在我看来,问题是索引sdr
。首先一个调用
Session.Add("username", sdr[0].ToString());
下面两行使用
smd.Parameters.AddWithValue("@username", sdr[1].ToString());
但无论如何,最安全的方式是创建SELECT语句命名colums而不是使用*
发现了这一点,并发表评论。这个答案的投票:) – davmos 2013-05-03 21:32:58
检查您用于用户名的值是否存在于表中。
您还将两次添加相同的参数。我不知道SqlCommand类如何处理,我现在无法测试,但我认为在执行之间清除参数(smd.Parameters.Clear()
)可能是个好主意。
看看我的代码。我在第9行写了这个命令! – 2013-05-03 21:23:30
对不起,我一开始并没有看到它。我的错。 – Renan 2013-05-03 21:28:07
你为什么要这么做smd.ExecuteNonQuery( )两次? – Melanie 2013-05-03 21:20:47
您从'sdr [0]'获取会话的用户名,但是从sdr [1]'获取的SQL参数。它是否在读者的两个元素? – davmos 2013-05-03 21:25:09
@Melanie:'int id = smd.ExecuteNonQuery()'用于跟踪。我删除它。 – 2013-05-03 21:25:15