SqlDataReader читает все остальные строки?

Я часами пытался просмотреть свой код, пытаясь понять, где я ошибся, и у Google, похоже, тоже нет ответа. В основном я использую этот код:

public bool LoginRequest(string ReceivedUsername, string ReceivedPassword)
    {

        bool ValidLogin = false;

        try
        {

            using (SqlConnection myConnection = new SqlConnection(ConnectString))
            {
                myConnection.Open();
                Log.Debug("Succesful sql connection");
                SqlCommand userSELECTcom = new SqlCommand("SELECT username,password FROM users;", myConnection);
                SqlDataReader reader = userSELECTcom.ExecuteReader();

                    //verify login
                    while (reader.Read())
                    {
                        CompareUsername = reader["username"].ToString();
                        ComparePassword = reader["password"].ToString();
                        Log.Debug(ReceivedUsername + " against " + CompareUsername);
                        Log.Debug(ReceivedPassword + " against " + ComparePassword);

                        if (CompareUsername == ReceivedUsername && ComparePassword == ReceivedPassword)
                        {
                            ValidLogin = true;
                            Log.Debug(ReceivedUsername + " has logged in successfully!!!");
                            myConnection.Close();//close sql conn
                            reader.Close();//close sqldatareader
                            return ValidLogin;
                        }

                        else if (CompareUsername != ReceivedUsername || ComparePassword != ReceivedPassword)
                        {
                            if (!reader.Read())
                            {
                                Log.Debug(ReceivedUsername + " has not logged in successfully with password: " + ReceivedPassword);
                                myConnection.Close();//close sql conn
                                reader.Close();//close sql data reader
                                return ValidLogin;
                            }
                        }
                    }
                    //end of verify sequence
            }

        }
        //logging any login request issues
        catch (Exception e)
        {
            Log.Debug(e);
        }
        return ValidLogin;

    }

У меня настроена программа ведения журнала, которая сообщает мне обо всем, что происходит при выполнении кода. Эти строки: " Log.Debug(ReceivedUsername + " против " + CompareUsername); Log.Debug(ReceivedPassword + " против " + ComparePassword); "

помогает мне увидеть, какая строка проверяется читателем. Я попытался с шестью строками, каждая с уникальными именами пользователей и паролями, и результат в основном показывает, что только строки 1, 3 и 5 проверяются читателем на ввод данных пользователя. Поэтому, если я попытался войти в систему со своим клиентом, используя имя пользователя и пароль из строк 2, 4 или 6, я получаю сообщение об ошибке, в котором говорится, что мой вход не выполнен. Кто-нибудь может объяснить, почему это происходит?

4 ответа

Решение

Для простоты вы можете напрямую запросить данные из базы данных.

Ниже приведен пример кода, чтобы проверить, существуют ли полученные имя пользователя и пароль в БД:

string sql = @"SELECT username,password FROM users 
             WHERE username=@username and password = @password";

SqlCommand userSELECTcom = new SqlCommand(sql, myConnection);
userSELECTcom.Parameters.AddWithValue(@username, ReceivedUsername);
userSELECTcom.Parameters.AddWithValue(@password, ReceivedPassword);

using(SqlDataReader reader = userSELECTcom.ExecuteReader())
{
   ValidLogin = reader.HasRows; 
}

У вас есть дополнительный Reader.Read() позвоните в вашем состоянии, когда вы не нашли логин в это время. Это перейти к следующей записи, а затем ваш основной цикл Reader.Read() переходит к следующему.

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

У вас есть 2 reader.Read() на if заявление внутри while блок. Это заставляет ваш код пропустить запись.

else if (CompareUsername != ReceivedUsername || ComparePassword != ReceivedPassword)
{
if (!reader.Read())  //remove this condition it will skip the current loop                             
{
Log.Debug(ReceivedUsername + " has not logged in successfully with password: " + ReceivedPassword);
myConnection.Close();//close sql conn
reader.Close();//close sql data reader
return ValidLogin;
}
}
Другие вопросы по тегам