Member 13713430 Ответов: 2

Ссылка на объект не устанавливается на объект


SqlConnection con = new SqlConnection(Helper.connstr);
            SqlCommand cmd = new SqlCommand("SELECT UserName FROM LoginInfo WHERE UserName='" + txtUserName.Text  +"'", con);
            con.Open();
            string Un = cmd.ExecuteScalar().ToString();
            if (Un == txtUserName.Text)
            {
                lblError.Visible = true;
                lblError.Text = "Valid User";
                lblError.ForeColor = System.Drawing.Color.Green;
                cmd = new SqlCommand("SELECT Passwd FROM LoginInfo WHERE Passwd='" + txtPassword.Text + "'", con);
                (THROWS ERROR HERE)string Pwd =cmd.ExecuteScalar().ToString();
                 if (Pwd == txtPassword.Text) 
                {

                }
                else
                {
                    lblError.Visible = true;
                    lblError.ForeColor = System.Drawing.Color.Red;
                    lblError.Text = "Invalid Password...";
                }
            }
        
            else
            {
                lblError.Visible = true;
                lblError.ForeColor = System.Drawing.Color.Red;
                lblError.Text = "User Does Not Exist";
            }


Что я уже пробовал:

Я не понимаю, что делать?

Richard MacCutchan

Вы делаете все неправильно: конкатенацию строк SQL-команд, хранение паролей в открытом тексте, не проверяя плохой результат от SQL и т. д. Вам нужно сделать некоторые правильные исследования SQL, .NET и безопасности.

2 Ответов

Рейтинг:
2

Jochen Arndt

Видеть Свойство sqlcommand.Метод ExecuteScalar (System.Data.SqlClient)[^]:

Цитата:
значение
система типов.Объект

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

Обратите также внимание, что вы никогда не должны использовать такие SQL-запросы, потому что они склонны к SQL-инъекция - Википедия[^]. Вместо этого используйте параметризованные запросы.
[Править]см. Свойство sqlcommand.Параметров Собственность (Системы.Данных.Поставщики sqlclient)[^] [/РЕДАКТИРОВАТЬ]

Вы также должны использовать один комбинированный запрос, передающий имя и пароль, потому что могут быть разные пользователи, имеющие один и тот же пароль. Также распространенной практикой является сообщать об ошибках входа в систему без какой-либо информации о неправильной части(частях), потому что эта информация поможет злоумышленникам.


Jochen Arndt

Смотрите ссылку, которую я добавил к своему ответу.

Рейтинг:
14

CPallini

От Свойство sqlcommand.Метод Executescalar Документации[^]:

значение
система типов.Объект
Первый столбец первой строки в результирующем наборе, или a нулевая ссылка (Ничего в Visual Basic), если результирующий набор пуст.


Вы либо прямо обращаетесь с возможным null значение или поймать брошенное исключение.


Member 13713430

Как бы я это сделал?