Вложенный оператор If с условным "и" в SQL

У меня есть эта строка кода

string sqlQuery = "SELECT studentid,StudentName,age,contact FROM tblStudent2 ";

if (txtStudentName.Text != "" && txtStudentId.Text != "" && txtAge.Text != "" && txtContact.Text != "")
{
    sqlQuery += " Where ";

    if (txtStudentName.Text != "")
    {
        sqlQuery += "studentId = '" + txtStudentName.Text + "'";
    }
    sqlQuery += " and ";

    if (txtStudentId.Text != "")
    {
        sqlQuery += "studentId = '" + txtStudentId.Text + "'";
    }
    sqlQuery += " and ";

    if (txtAge.Text != "")
    {
        sqlQuery += "age ='" + txtAge.Text + "'";
    }

    sqlQuery += " and ";

    if (txtContact.Text != "")
    {
        sqlQuery += " FROM tblStudent2 Where contact ='" + txtContact.Text + "'";
    }
}

Цель моего вопроса - выбрать из таблицы (tblStudent2). С помощью этого оператора SQL

"ВЫБЕРИТЕ ИДЕНТИФИКАТОР учащегося,имя учащегося,возраст,контакт ИЗ tblStudent2" + "и (столбцы таблицы) и (столбцы таблицы)""

Но цель состоит в том, чтобы добавить «и» между вложенными параметрами IF, если бы я добавил его в оператор if, результирующий sqlQuery приведет к «и» в качестве последнего слова предложения, если я добавлю «и " слово.

Объединение SQL — это рецепт катастрофы. Не делай этого. Используйте параметризованные запросы, чтобы не стать жертвой Little Bobby Tables. На Stack Overfow и на веб-сайте Oracle есть тонны информации об этом.

madreflection 23.12.2020 10:08

У меня есть отдельная функция для анализа этого запроса. Моя отдельная функция была протестирована, и я думаю, она устойчива к SQL-инъекциям. Я понимаю опасность внедрения sql. Спасибо, что предупредили меня.

TheProgrammerNoob 23.12.2020 10:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
249
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Лучше добавить «И» в конце каждого оператора, помещенного в условие if, и удалить последний, как показано ниже:

string sqlQuery = "SELECT studentid,StudentName,age,contact FROM tblStudent2";
bool flag = false;
if (txtStudentName.Text != "")
    {
        sqlQuery += "StudentName = '" + txtStudentName.Text + "' and ";
        flag = true;
    }
if (txtStudentId.Text != "")
    {
        sqlQuery += "studentId = '" + txtStudentId.Text + "' and ";
        flag = true;
    }
if (txtAge.Text != "")
    {
        sqlQuery += "age ='" + txtAge.Text + "' and ";
        flag  = true;
    }
if (txtContact.Text != "")
    {
        sqlQuery += "contact ='" + txtContact.Text + "' and ";
        flag = true;
    }
if (flag == true){
    sqlQuery += " WHERE " + sqlQuery.Substring(0, myString.Length-5);
}

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

TheProgrammerNoob 23.12.2020 10:19

Или начните с WHERE 1=1, а затем добавьте каждое условие, где это необходимо: + " AND column=value"

Hans Kesting 23.12.2020 10:43

Я бы предложил написать эту логику без логического значения:

string sqlQuery = "SELECT studentid,StudentName,age,contact FROM tblStudent2";
string sqlWhere = ""
if (txtStudentName.Text != "")
    {
        sqlWhere += "StudentName = '" + txtStudentName.Text + "' and ";
    }
if (txtStudentId.Text != "")
    {
        sqlWhere += "studentId = '" + txtStudentId.Text + "' and ";
    }
if (txtAge.Text != "")
    {
        sqlWhere += "age ='" + txtAge.Text + "' and ";
    }
if (txtContact.Text != "")
    {
        sqlWhere += "contact ='" + txtContact.Text + "' and ";
    }
if (sqlWhere != "") {
    sqlQuery += " WHERE " + sqlWhere.Substring(0, myString.Length-5);
}

Тем не менее, ваш код имеет ОСНОВНУЮ проблему. Вы искажаете строку запроса с введенными пользователем значениями - как из-за внедрения SQL, так и из-за неожиданных (и трудно отлаживаемых) синтаксических ошибок. Это очень опасно. Вы должны параметризовать запрос, поэтому он больше похож на:

if (txtStudentName.Text != "")
    {
        sqlWhere += "StudentName = @StudentName and "
    }

(и так далее).

Затем передайте параметры в запрос при его выполнении.

Другие вопросы по теме