У меня есть этот код входа, который работает, если в базе данных есть только один пользователь, но если я добавлю другого пользователя, а затем войду с этой учетной записью, появится сообщение «Неверное имя пользователя или пароль», но затем, когда я нажму «ОК», он перенаправит меня в форму 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();
    }
-1
krneki 27 Май 2017 в 18:49

2 ответа

Лучший ответ

Если у вас есть один пользователь, цикл while будет зациклен один раз. Поэтому while проверяет, существует ли пользователь, если нет, то покажет окно сообщения.

Если у вас более одного пользователя. Затем цикл while будет выполняться X раз. Но когда он зацикливается в течение первого времени, и учетные данные не совпадают с заданными, то это покажет окно сообщения.

Вы сказали, что добавили второго пользователя. Поэтому, когда вы входите в систему с этим вторым пользователем, первый пользователь во время цикла будет ложным. Вот почему он показывает окно сообщения.

Чтобы решить эту проблему, вы можете попробовать что-то вроде этого:

       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();
1
Timon Post 27 Май 2017 в 16:04

Вы не должны принимать решение в своем заявлении while, вы можете сделать что-то вроде следующего:

 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 в свой запрос, чтобы проверить, есть ли в вашей таблице строка, в которой есть пользователь с такими же данными, как введенные имя пользователя и пароль.

0
Abdullah Dibas 27 Май 2017 в 16:06