2016-05-23 53 views
0

我剛剛學習c#和sql server。這個問題已被問了幾次,但發佈的解決方案似乎並沒有幫助我。 我有一個名爲「LoginInfo」的表,有一個用戶的「電子郵件」和「通過」。 在Visual Studio中,我有這種方法,檢查一個用戶的登錄信息「多部分標識符無法綁定」sql,visual studio

private boolean dbQueryLogin(string email, string password) 
    { 
     string com = "SELECT pass FROM LoginInfo WHERE email = [email protected]"; 

     SqlCommand command = new SqlCommand(com, conn); 
     SqlDataReader reader = command.ExecuteReader(); 

     return reader.GetString(0).Equals(password); 
    } 

這保持上引發錯誤「其他信息:多部分標識符‘XXXX.edu’無法綁定」。 語法看起來很適合我,有什麼我失蹤?

+0

您打算將電子郵件地址放在引號中:'WHERE email ='XXXXX @ yahoo.com''。但是,更好的解決方案是使用參數化的SQL。 –

+0

開始使用參數化查詢,不要請求sql注入 –

回答

2

線索是在錯誤消息:

多部分標識符「XXXX.edu」不能被約束。

這強烈暗示問題不在於識別您的表 - 它與以「edu」結尾的位相似,該位似乎是電子郵件地址。

立即問題是,你已經忘記引用一個值。 更深的問題是,無論如何你應該使用參數化的SQL,以避免SQL injection attacks,轉換問題和不可讀的代碼。既然你在相同的代碼已經給出的值是不一樣有什麼錯誤消息,我懷疑你真的有這樣的代碼:

string sql = "SELECT pass FROM LoginInfo WHERE email = " + email; 

不要那樣做。使用參數化的SQL來代替:

private boolean dbQueryLogin(string email, string password) 
{ 
    string sql = "SELECT pass FROM LoginInfo WHERE email = @email"; 
    using (var connection = new SqlConnection(connectionString)) 
    { 
     using (var command = new SqlCommand(sql)) 
     { 
      command.Parameters.Add("@email", SqlDbType.NVarChar).Value = email; 
      using (var reader = command.ExecuteReader()) 
      { 
       // FIXME: What do you want to do if 
       // there are no matches? 
       reader.Read(); 
       return reader.GetString(0) == password; 
      } 
     } 
    } 
} 

這還不是雖好代碼:

  • 不要純文本密碼存儲在數據庫中
  • 處理的情況下沒有結果
  • 根本不要建立自己的認證系統;使用由具有更多安全數據經驗的人編寫的現有文件
+0

沒有什麼比這個答案更好。 –

+0

這是完美的! – SomeGuyFortune

相關問題