2014-10-09 25 views
0
 private void btnLogin_Click(object sender, EventArgs e) 
     { 
      { 
      Connections.con.Open();  

      string login = "SELECT ID, Username, [Password] FROM Employee"; 
      OleDbCommand command = new OleDbCommand(login, Connections.con); 
      command.Connection = Connections.con; 
      command.Parameters.AddWithValue("@?", txtLUser.Text.ToString()); 
      command.Parameters.AddWithValue("@?", txtLPass.Text.ToString()); 
      OleDbDataReader reader = command.ExecuteReader(); 
      int count = 0;     
      while (reader.Read()) 
      { 
       count = count + 1; 
       break; 
      } 

      if (count == 1) 
      { 
       MessageBox.Show("Login Successful."); 
       this.Close(); 
      } 
      else 
      { 
       MessageBox.Show("Please enter a valid Username or Password"); 
      } 

      Connections.con.Dispose(); 
      Connections.con.Close(); 

      MessageBox.Show("Thank you for using this Simple Login/Registration Form."); 
     } 

仍然记录它总是每当我点击登录按钮,并在用户名/密码文本框,我还没有录入任何而且没有空白在我利用注册登录数据库 有什么建议?我不输入任何帐户,但在

+3

您错过了属性 – Tushar 2014-10-09 13:02:31

+0

什么属性先生? OMG! – 2014-10-09 13:04:57

回答

1

你错过了其中的属性

string login = "SELECT ID, Username, [Password] FROM Employee where [email protected]? and [Password]= @? "; 
+1

我怎么忘记了!非常感谢主席先生。明天是我们对这个简单系统的介绍,这是我面临的唯一问题!谢谢你,先生! – 2014-10-09 13:16:07

+0

快乐编码:) – Tushar 2014-10-09 13:16:33

2

你不是真正检查的用户名和密码。看看数据库查询:

"SELECT ID, Username, [Password] FROM Employee" 

这将选择Employee表中的每个记录。然后,你检查这些记录:

while (reader.Read()) 
{ 
    count = count + 1; 
    break; 
} 

if (count == 1) 
{ 
    MessageBox.Show("Login Successful."); 
    this.Close(); 
} 

按照这个逻辑,只要任何记录存在于Employee,登录成功。

可能想检查只有记录匹配提供的凭据。事情是这样的:

"SELECT [ID], [Username], [Password] FROM [Employee] WHERE [Username] = @? AND [Password] = @?" 

(我根据你怎么加的参数,因为我不熟悉MS Access语法猜测的参数语法,但希望你明白我的意思。)

另外,和这是重要的,您似乎是以纯文本存储用户密码。这是做得非常可怕的事情。请妥善散列密码,以免它们被读为纯文本。

此外,你似乎是使用共享连接对象:

Connections.con.Open(); 

这将导致的问题一大堆。在使用它的方法范围内创建连接对象要简单得多并且更稳定。基本上,连接对象应该创建,使用和处理在一个非常狭窄的范围内,不应该超出范围泄漏。

+0

我应该在关闭它之前处理连接吗? – 2014-10-09 13:17:56

+0

@JoeyEguna:没有。虽然那*特殊的*对象可能*巧合地能够处理事件的顺序(我不确定),这不是一个好主意。处理物品时,不应将其视为可用于任何目的。所以不应该再调用其他方法。您可以避免必须通过将其封装在'using'块中来调用Dispose()。例如:'使用(var connection = OleDbConnection()){//使用连接}'A'使用''块在超出范围时会自动处理对象。 – David 2014-10-09 13:20:18

相关问题