Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.230.44] |
|
Сообщ.
#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 записи в секунду тут уже решать что-то надо |
Сообщ.
#16
,
|
|
|
Цитата Павел Калугин @ Это точно! Fr0sT ой не разбирал ты авгиевы конюшни за чужими программами.... |
Сообщ.
#17
,
|
|
|
Павел Калугин, да, не доводилось, признаю. Но едва ли стоит гордиться подобным опытом разгребания, если введение предварительной фильтрации могло бы полностью его исключить. Хотя не исключаю ситуации, когда это невозможно либо слишком затратно.
|
Сообщ.
#18
,
|
|
|
Fr0sT От на сто процентов ты прав. Но иногда задача выглядит так
Вот наша старая программка. Надо доработать функционал ... ... ... (стопицот страниц требований) И ни в коем случае не потерять И вот тогда и мать вспомнишь и прабабку того разработчика, который эту программку во времена царя Гороха на коленке слепил... Советы ввод ограничить, хороши для новой разработки. Но для приведения данных к новому стандарту они, увы, не пригодны |
Сообщ.
#19
,
|
|
|
Цитата Fr0sT @ ППКС! О чём речь! Вот только почему-то не включили. Видно забыли. А я щяс разгребаю. Если не боишься измазаться - подфорум Oracle за последние 2 года здорово подрос на моих темах.введение предварительной фильтрации могло бы полностью его исключить Цитата Павел Калугин @ За 15 лет, Павел... А всё остальное ты правильно определил. ни в коем случае не потерять ... за 12 лет накопленные со времен царя Гороха данные --- Кстати о кавычках - в качестве символа ударения нашёл тильды. Вот так вот. |
Сообщ.
#20
,
|
|
|
Цитата #SI# @ в качестве символа ударения нашёл тильды Жали шифт когда не надо, что ли? Добавлено Честно говоря, почитал твои темы и не нашел особых заморочек. Тем более что у тебя операция по разгребанию разовая, и ее можно выполнять итерационно. |
Сообщ.
#21
,
|
|
|
Цитата Павел Калугин @ Но для приведения данных к новому стандарту они, увы, не пригодны Так они обычно одноразовые , можно и потерпеть. Другое дело когда данные приходят от царя Гороха, и никто не помнит кто это написал и исходников не оставил. |
Сообщ.
#22
,
|
|
|
Bas Если исходники есть это уже сродни чуду. А если еще и разработчик доступен, который это писал лет цать назад это даже не чудо это просто праздник какойто У меня щас каждая вторая задача это перенос какого-нибудь старого функционала в новую систему.... Лепота...
|
Сообщ.
#23
,
|
|
|
Ладно, братцы, уже флуд пошёл...
|