Member 14910143 Ответов: 2

Пожалуйста, я решу эту проблему


Ошибка сервера в приложении'/'.

Выражение небулевского типа, заданное в контексте, где ожидается условие, рядом с "именем".
Описание: необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Data.SqlClient.SqlException: выражение небулевского типа, заданное в контексте, где ожидается условие, рядом с "именем".

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

Ошибка Источника:


Строка 19: строка checkuser = "select count(*) from UserData where User Name=' " + TextBoxUN.Текст + "'";
Строка 20: SqlCommand com = new SqlCommand(checkuser, conn);
Строка 21: int temp = Convert.ToInt32(com.ExecuteScalar().Метод toString());
Строка 22: if (temp == 1)
Строка 23: {

2 Ответов

Рейтинг:
2

Sandeep Mewara

2 вещи:
Во-первых, плохой способ получения данных из базы данных. Полностью открыт для угрозы безопасности с помощью SQL-инъекции.
Читайте о защите от SQL-инъекций здесь: Смягчение последствий SQL-инъекций: использование параметризованных запросов[^]

Второй,
поверьте, что "имя пользователя" - это имя coumn с пробелом в вашей базе данных. Если да, то заключите это в квадратные скобки:

String checkuser = "select count(*) from UserData where [User Name]=' " + TextBoxUN.Text + "'";

В настоящее время имя пользователя не считается одним словом SQL и выдает ошибку.


Рейтинг:
1

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Кроме того, у вас есть пробел в имени столбца. Вам нужно правильно указать имя столбца, чтобы запрос работал.

const string checkuser = "select count(*) from UserData where [User Name] = @UserName";
using (SqlConnection connection = new SqlConnection("..."))
using (SqlCommand command = new SqlCommand(checkuser, connection))
{
    command.Parameters.AddWithValue("@UserName", TextBoxUN.Text);
    
    connection.Open();
    object result = command.ExecuteScalar();
    
    int temp = (result == null || Convert.IsDBNull(result)) ? 0 : Convert.ToInt32(result);
    if (temp != 0)
    {
        ...
    }
}
В идеале вы должны обновить свою базу данных, чтобы не использовать "специальные" символы или пробелы в именах таблиц или столбцов.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]