2013-05-03 56 views
0

我在我的登錄頁面中編寫了此代碼。我的代碼沒有任何錯誤,但更新查詢不適用於我的數據庫。
拳頭查詢工作,我重定向到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

回答

3

在我看來,問題是索引sdr。首先一個調用

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

下面兩行使用

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

但無論如何,最安全的方式是創建SELECT語句命名colums而不是使用*

+0

發現了這一點,並發表評論。這個答案的投票:) – davmos 2013-05-03 21:32:58

0

檢查您用於用戶名的值是否存在於表中。

您還將兩次添加相同的參數。我不知道SqlCommand類如何處理,我現在無法測試,但我認爲在執行之間清除參數(smd.Parameters.Clear())可能是個好主意。

+0

看看我的代碼。我在第9行寫了這個命令! – 2013-05-03 21:23:30

+0

對不起,我一開始並沒有看到它。我的錯。 – Renan 2013-05-03 21:28:07