Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.82.23] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте. Удаляю данные из базы данных
ADOQuery1.Active := false; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Text := 'DELETE FROM dbbase WHERE ID='+ListView1.Items[i].SubItems[6]+''+' and NAME="'+ListView1.Items[i].SubItems[1]+'"'; ADOQuery1.ExecSQL; При нормальных условиях все проходит хорошо, но если вдруг в значении ListView1.Items[i].SubItems[1] есть двойные кавычки ("), то возникает ошибка 'Ошибка синтаксиса (пропущен оператор) в выражении запроса 'ID=103274 and NAME="Правила применения стандартов в ОАО "ХХХХХ", его дочерних обществах"'' Как правильно создать запрос с учетом этих кавычек??? |
Сообщ.
#2
,
|
|
|
Параметры использовать надо
Если верно помню ADOQuery1.SQL.Text := 'DELETE FROM dbbase WHERE ID=:param_1 and NAME=:param_1'; ADOQuery1.SQL.refresh; ADOQuery1.SQL.Parameters.ParamByName('param_1').value := ListView1.Items[i].SubItems[6]; ADOQuery1.SQL.Parameters.ParamByName('param_2').value := ListView1.Items[i].SubItems[1]; try ADOQuery1.ExecSQL; except on E:Exceptoin do Begin //Обработка ошибки, например запись в текстовый лог сформированного запроса и текста ошибки End; |
Сообщ.
#3
,
|
|
|
Use parameters, Luke!
|
Сообщ.
#4
,
|
|
|
Цитата Павел Калугин @ Параметры использовать надо ЗЫ - Твой совет МНЕ лет этак ... много ... назад. Работает! |
Сообщ.
#5
,
|
|
|
Сан Иваныч, а как больно эта привычка мне в пальцы врастала. Завсегда ж проще запрос в лоб собрать и execute его
|
Сообщ.
#6
,
|
|
|
Ах, это милое слово - SQL инъекция..
|
Сообщ.
#7
,
|
|
|
Павел Калугин спасибо большое, только надо в коде (для меня) было убрать
SQL |
Сообщ.
#8
,
|
|
|
А меня всегда бесили эти кавычки, которые в дельфийском варианте еще и удваиваются. От параметров кайфую и жалею, что их нету в XML XPath
|
Сообщ.
#9
,
|
|
|
Цитата Павел Калугин @ Это для Command . А для Query - ExecSQL .Завсегда ж проще запрос в лоб собрать и execute ЗЫ - сорри за флуд... Цитата Fr0sT @ Oracle. А у меня щяс инфа с ударениями. Как раз с символом ' . Так вместо него чего только не на вводили! Сижу, разгребаю... А меня всегда бесили эти кавычки, которые в |
Сообщ.
#10
,
|
|
|
Цитата jack128 @ Жнеь, ну это если давать пользователю запрос / параметры запроса с руки воодить |
Сообщ.
#11
,
|
|
|
Цитата #SI# @ Oracle. А у меня щяс инфа с ударениями. Как раз с символом ' А вот и попался! Апостроф, символ ударения и кавычка - это три совершенно разных символа (хотя кавычка иногда может служить в роли апострофа). А есть еще и модифицирующее ударение )) |
Сообщ.
#12
,
|
|
|
Цитата mimo @ Как правильно создать запрос с учетом этих кавычек??? Можно вместо ручного закавычивания использовать ф-ю AnsiQuotedStr: ADOQuery1.SQL.Text := Format('DELETE FROM dbbase WHERE ID=%s and NAME=%s', [ListView1.Items[i].SubItems[6], AnsiQuotedStr(ListView1.Items[i].SubItems[1],'"')]); |
Сообщ.
#13
,
|
|
|
Цитата Fr0sT @ Вот только операторам это по барабану - лепят ТО, что визуально соответствует данным. А вот и попался! Апостроф, символ ударения и кавычка - это три совершенно разных символа |
Сообщ.
#14
,
|
|
|
#SI#, значит, надо фильтровать ввод.
|
Сообщ.
#15
,
|
|
|
Fr0sT ой не разбирал ты авгиевы конюшни за чужими программами....
Про ограничение ввода - это все классно но это мили/микро секунды (а то и больше) на каждую проверку. Соответственно всегда нужен баланс между количеством проверок и скоростью обработки. Не, если у тебя поток 2 записи в день - обпроверяйся. А если 2 записи в секунду тут уже решать что-то надо |