В данном запросе пользователь столкнулся с несколькими проблемами, которые часто встречаются при работе с SQL-запросами в среде Delphi. Основные моменты, на которые стоит обратить внимание:
Использование одинарных кавычек для обозначения строк в SQL-запросах. В Delphi для этого используются символы '', то есть две одинарные кавычки подряд.
Использование символа процента % для обозначения подстановки любых символов в SQL-запросах. В коде, представленном в вопросе, используется звездочка *, что является некорректным.
Обработка пустого ввода при формировании SQL-запроса. В коде присутствуют условия, которые должны обеспечивать корректное формирование запроса, но они не учитывают некоторые случаи, например, отсутствие пробегов в конце некоторых строковых переменных.
Давайте рассмотрим, как можно улучшить представленный код, исправив эти ошибки:
procedure TFormVet.sdaClick(Sender: TObject);
var
anID, anT, anN, anG, anSp, anSi, anDR, anDF, anPD, anTr, anO: String;
anRID, anRT, anRN, anRG, anRSp, anRSi, anRDR, anRDF, anRPD, anRTr, anRO: String;
begin
ShowMessage('Если вы не ищите конкретную группу данных, оставьте поле ввода пустым!');
// Здесь код запроса данных об животном, который уже содержит некоторые ошибки в логике...
// ...
// Исправляем использование звездочки для подстановки на процент:
anRID := (GetLength(anID) > 0) ? Format('AnimalID = ''%s''', [anID]) : '(AnimalID LIKE ''%%'')';
// Исправление дублирования строки anRT и добавление корректного условия для LIKE:
anRT := (GetLength(anT) > 0) ? Format('anType = ''%s''', [anT]) : '(anType LIKE ''%%'')';
// Повторяем для остальных полей аналогичные исправления...
// ...
// Обработка статуса оплаты с дополнительной проверкой на валидность ввода:
if GetLength(anPD) > 0 then
case UpperCase(anPD) of
'YES': anRPD := '(anPaid = ''-1'')';
'NO': anRPD := '(anPaid = ''0'')';
else
ShowMessage(anPD + ' не является корректным запросом!');
end;
else
anRPD := '(anPaid LIKE ''%%'')';
// Остальная часть кода...
// ...
// Формирование итогового SQL-запроса:
SS := 'SELECT * FROM tblAnimal WHERE ' + anRT + ' AND ' + anRN + ' AND ' + // ... (и так далее)
// ...
// Завершаем запросы, содержащие ошибку с удвоенным кодом поля anType:
SS := DeleteDuplicates(SS, 'AND ' + anRT + ' ');
// Убираем пробелы между условиями, которые могут появиться из-за неаккуратной сборки запроса:
SS := StringReplace(SS, ' ', ' ', [TReplaceFlags rfReplaceAll]);
// Продолжение...
// ...
adoAnimal.Close;
adoAnimal.SQL.Text := SS;
adoAnimal.ExecSQL;
adoAnimal.Open;
end;
В данном примере используется несколько новых функций:
Format для корректного вставления строковых значений в SQL-запрос.
DeleteDuplicates для устранения дубликатов в SQL-запросе.
StringReplace для устранения лишних пробелов, возникших при сборке запроса.
Также были добавлены проверки на корректность ввода и условие для полей, где запрос не вводился, для создания подходящих фильтров, не влияющих на общий запрос (используется символ подстановки %).
Важно помнить, что использование подобного подхода к формированию SQL-запросов в реальной программе может быть подвержено SQL-инъекциям. Поэтому для защиты от них следует использовать параметризованные запросы.
Пользователь столкнулся с необходимостью исправить ошибки в коде Delphi, связанные с формированием SQL-запросов, включая правильное использование кавычек, символов подстановки и обработку пустого ввода.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.