2012-03-08 106 views
1

我寫了下面的代碼,使用C#和LINQ登錄到我的應用程序。它連接到我在Visual Studio中創建的SQL服務導向數據庫。我遇到的問題是我不明白的問題,希望有人能夠幫助我。我創建了兩條消息,試圖查看我的代碼的輸出,我沒有從中獲得任何信息。登錄表單故障

如果任何人都可以幫助,那會很棒!

public bool UserLogin(string User, string Pass) 
{ 
    var Database = new ExampleDataSet(); 

    var query = from Employee in Database.Employee 
     where (Employee.EmployeeID.ToString() == Employee.ToLower() && Employee.Password == Pass) 
     select Employee; 

    if (query.Count() != 0) 
    { 
     return true; 
     MessageBox.Show("You are logged in"); 
    } 

    return false; 
    MessageBox.Show("You are not logged in"); 
} 

private void cmdLogin_Click(object sender, EventArgs e) 
{ 
    string User = (txtUser.Text); 
    string Pass = (txtPass.Text); 
    UserLogin(User, Pass); 
} 
+0

也許嘗試用引號封裝密碼?如果您調試的是發送數據庫中相同的值嗎? – Gage 2012-03-08 13:51:24

回答

0

如果你的意思是用戶=僱員

Employee.EmployeeID.ToString() == user.ToLower() 

如果不是:

Employee.EmployeeName.ToLower() == user.ToLower() 

關於消息框,你應該知道的任何陳述後return不會被執行

+1

這個問題似乎是他爲什麼沒有從他的MessageBoxes得到任何輸出,儘管... – 2012-03-08 12:29:12

2

當你返回的時候,函數的執行會停止,因爲它已經完成並且會返回值到它的值如所稱。所以你迴歸之後的任何事情都不會發生。嘗試把MessageBox.Showreturn前:

MessageBox.Show("You are logged in"); 
return true; 

與同爲假版本。

1

消息框不會顯示,因爲他們是返回語句 - 將您的消息框移動到返回前看到它們。

3

從您編寫的代碼看來,問題在於您將Employee的字符串表示法與其EmployeeId屬性Employee.EmployeeID.ToString() == Employee.ToLower()進行比較。除非你重寫ToString()方法Employee類來返回屬性EmployeeId(我認爲你沒有),否則此行將始終返回false。 試試這個(假設參數User包含用戶名):

using(var dataSet = new ExampleDataSet()) 
{ 
    var loggedIn = dataSet.Employee.Any(e=>e.UserName == User && e.Password == Pass); 
    var message = loggedIn ? "You are logged in" : "You are not logged in"; 
    MessageBox.Show(message); 
    return loggedIn; 
} 
+0

用戶ID將成爲用戶名。我實際上刪除了ToLower並將數據類型更改爲Int,但我仍然收到一條消息,說我沒有登錄。 – 2012-03-08 12:58:23

+0

嘗試打開Sql Server分析器以查看針對數據庫執行的確切sql查詢並檢查查詢參數針對數據庫值的值。 – RePierre 2012-03-08 13:40:22

1

我已經在你的代碼更改....你的if-else部分是無效......你與僱員本身比較employee.ID ..用下面的代碼試用.....

  public bool UserLogin(string User, string Pass) 
      { 

       var Database = new ExampleDataSet(); 

       var query = from Employee in Database.Employee 
          where (Employee.EmployeeID.ToString().ToLower().Equals(User.ToLower())&& Employee.Password.ToString().ToLower().Equals(Pass.ToLower()) 
          select Employee; 

       if (query.Count() != 0) 
       { 
        MessageBox.Show("You are logged in"); 
        return true; 
       } 
       else 
       { 
        MessageBox.Show("You are not logged in"); 
        return false; 
       } 



      } 

      private void cmdLogin_Click(object sender, EventArgs e) 
      { 
      string User = (txtUser.Text); 
      string Pass = (txtPass.Text); 
      UserLogin(User, Pass); 
      } 
+0

EmployeeID實際上表示爲數據庫中的整數。我試圖改變代碼來表示這一點,我不斷收到一條消息,說用戶沒有登錄。 – 2012-03-08 13:12:19

0

不建議您編寫自己的用戶驗證。要做到這一點非常困難,並且在大多數情況下,您可以使用Windows或dot net框架提供的一種。

例如,您的應用程序不應以純文本格式存儲用戶密碼。如果您的應用程序或數據庫受到攻擊,攻擊者不僅可以獲得對應用程序的完全訪問權限,還可以獲得用戶在其他地方也可能使用的密碼列表。

如果您需要存儲用戶憑證,應首先對其進行醃製,然後使用安全散列算法對其進行散列處理。這可以防止任何獲得數據庫訪問權限的人學習用戶密碼。

要驗證密碼,請在數據庫中查找salt,將密碼附加到該密碼,對結果進行散列,然後將其與存儲的值進行比較。如果它們相同,則用戶輸入正確的密碼。

如果您正在編寫將用於Windows域的應用程序,則可以使用Active Directory組來控制對應用程序的訪問。在最簡單的層面上,您可以將應用程序存儲在只能由授權用戶訪問的文件夾中。

您還可以使用組來控制對應用程序連接到的數據庫的訪問。如果您使用的是SQL Server,則應將每個組放置在SQL數據庫角色中,然後再爲該角色授予必要的權限。

從應用程序中,您可以查找用戶組成員身份,並使用它來確定顯示哪些表單/菜單選項,或者如果他們未被授權退出應用程序。

如果您正在編寫ASP.Net應用程序,請考慮使用內置於框架中的MemberShip和Roles。