2017-05-27 7 views
-1

データベースにユーザーが1人しかいない場合に動作するこのログインコードがありますが、別のユーザーを追加してそのアカウントでログインすると「間違ったユーザー名またはパスワード」というメッセージが表示されますが、 OKをクリックするとForm1にリダイレクトされます。ログインフォームが動作しません

private void buttonLogin_Click(object sender, EventArgs e) 
    { 

     SQLiteConnection conn = new SQLiteConnection("data source = zivali.sqlite"); 
     conn.Open(); 
     SQLiteCommand com = new SQLiteCommand(conn); 

     com.CommandText = "SELECT * FROM login;"; 

     SQLiteDataReader reader = com.ExecuteReader(); 

     while (reader.Read()) 
     { 
      string username = reader["username"].ToString(); 
      string password = reader["password"].ToString(); 


       if (username == textBoxUserName.Text && password == textBoxPassword.Text) 
       { 
        this.Hide(); 
        Form1 f1 = new Form1(); 
        f1.ShowDialog(); 
       } 
       else 
       { 
        MessageBox.Show("Wrong username or password"); 
       } 

     } 
     conn.Close(); 
    } 
+0

ログイン成功/失敗コードは、db内のログインごとに実行されます。 N-1の間違ったユーザ名のメッセージボックスと1つのログインに成功した理由です。 – user6144226

答えて

1

ユーザーが1人いる場合は、whileループが1回ループします。したがって、whileは、ユーザーが存在するかどうかを確認し、存在しない場合はメッセージボックスを表示します。

複数のユーザーがいる場合。 whileループはX回実行されます。しかし、それがfirs時間のためにループし、資格が与えられたものと一致しない場合、それはメッセージボックスを表示するでしょう。

2番目のユーザーを追加したとします。したがって、その2番目のユーザーでログインすると、最初のユーザーはループしている間はfalseになります。それがメッセージボックスを表示している理由です。あなたは、次のような何かを行う必要がありますこと、ごwhile文の中、あなたの決断をしないようにしてい

 SQLiteConnection conn = new SQLiteConnection("data source = zivali.sqlite"); 
     conn.Open(); 
     SQLiteCommand com = new SQLiteCommand(conn); 

     com.CommandText = "SELECT * FROM login;"; 

     SQLiteDataReader reader = com.ExecuteReader(); 

     // place your username/password decleration here, no need to read them X times in a loop 
     string username = reader["username"].ToString(); 
     string password = reader["password"].ToString(); 

     // bool for if there is any user whith the given cridentials 
     bool loginValid = false; 
     while (reader.Read()) 
     { 
      // if cridentials mathch set loginValid to true and break out of the loop 
      if (username == textBoxUserName.Text && password == textBoxPassword.Text) 
      { 
       loginValid = true; 
       break; 

      } 
     } 

     // check if the login is true 
     if (loginValid) 
     { 
      this.Hide(); 
      Form1 f1 = new Form1(); 
      f1.ShowDialog(); 
     } 
     else 
     { 
      MessageBox.Show("Wrong username or password"); 
     } 
     conn.Close(); 
+0

こんにちは。私はあなたのコードを試みたが、今私はこのエラーメッセージが表示されますInvalidOperationException:現在の行のエラーはここにエラーの画像へのリンクです:http://imgur.com/vUMLoS2 – krneki

+0

私は間違ってこれらの行を移動しようとしたと思う: 'string username = reader ["username"]。ToString(); string password = reader ["password"]。ToString(); 'これはあなたの前と同じようにwhileループに入ります。 –

+0

これは今、おかげさまで働いています。 – krneki

0

:あなたはこのような何かを試すことができ、これを解決するために

bool doesMatch = false; 
string username = reader["username"].ToString(); 
string password = reader["password"].ToString(); 


while (reader.Read()) 
{ 
     if (username == textBoxUserName.Text && password == textBoxPassword.Text) 
     { 
      doesMatch = true; 
     } 
} 
if (doesMatch) 
{ 
    this.Hide(); 
    Form1 f1 = new Form1(); 
    f1.ShowDialog(); 
} 
else 
{ 
    MessageBox.Show("Wrong username or password"); 
} 

かクエリにWHEREステートメントを追加するだけで、テーブルの行に入力されたユーザー名とパスワードと同じデータを持つユーザーが存在するかどうかを確認できます。

関連する問題