我的更新查询不适用于数据库

问题描述:

我在我的登录页面中编写了此代码。我的代码没有任何错误,但更新查询不适用于我的数据库。
拳头查询工作,我重定向到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; 
     } 
} 
+1

你为什么要这么做smd.ExecuteNonQuery( )两次? – Melanie 2013-05-03 21:20:47

+2

您从'sdr [0]'获取会话的用户名,但是从sdr [1]'获取的SQL参数。它是否在读者的两个元素? – davmos 2013-05-03 21:25:09

+0

@Melanie:'int id = smd.ExecuteNonQuery()'用于跟踪。我删除它。 – 2013-05-03 21:25:15

在我看来,问题是索引sdr。首先一个调用

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

下面两行使用

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

但无论如何,最安全的方式是创建SELECT语句命名colums而不是使用*

+0

发现了这一点,并发表评论。这个答案的投票:) – davmos 2013-05-03 21:32:58

检查您用于用户名的值是否存在于表中。

您还将两次添加相同的参数。我不知道SqlCommand类如何处理,我现在无法测试,但我认为在执行之间清除参数(smd.Parameters.Clear())可能是个好主意。

+0

看看我的代码。我在第9行写了这个命令! – 2013-05-03 21:23:30

+0

对不起,我一开始并没有看到它。我的错。 – Renan 2013-05-03 21:28:07