У меня есть эта строка кода
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-инъекциям. Я понимаю опасность внедрения sql. Спасибо, что предупредили меня.
Лучше добавить «И» в конце каждого оператора, помещенного в условие 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);
}
Спасибо, я думаю, что этот код будет работать отлично. Я почесал голову, чтобы заставить его работать. Я изучил несколько новых команд, особенно подстроку, которая очень помогает при редактировании кода.
Или начните с WHERE 1=1
, а затем добавьте каждое условие, где это необходимо: + " AND column=value"
Я бы предложил написать эту логику без логического значения:
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 "
}
(и так далее).
Затем передайте параметры в запрос при его выполнении.
Объединение SQL — это рецепт катастрофы. Не делай этого. Используйте параметризованные запросы, чтобы не стать жертвой Little Bobby Tables. На Stack Overfow и на веб-сайте Oracle есть тонны информации об этом.