На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Удаление данных и кавычки
    Здравствуйте. Удаляю данные из базы данных
    ExpandedWrap disabled
          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] есть двойные кавычки ("), то возникает ошибка
    ExpandedWrap disabled
      'Ошибка синтаксиса (пропущен оператор) в выражении запроса 'ID=103274 and NAME="Правила применения стандартов в ОАО "ХХХХХ", его дочерних обществах"''

    Как правильно создать запрос с учетом этих кавычек???
      Параметры использовать надо
      Если верно помню
      ExpandedWrap disabled
        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;
      Сообщение отредактировано: Павел Калугин -
        Use parameters, Luke!
          Цитата Павел Калугин @
          Параметры использовать надо
          :yes: :yes:
          ЗЫ - Твой совет МНЕ лет этак ... много ... назад. Работает! :yes:
            Сан Иваныч, а как больно эта привычка мне в пальцы врастала. Завсегда ж проще запрос в лоб собрать и execute его
              Ах, это милое слово - SQL инъекция..
                Павел Калугин спасибо большое, только надо в коде (для меня) было убрать
                ExpandedWrap disabled
                  SQL
                  А меня всегда бесили эти кавычки, которые в дельфийском варианте еще и удваиваются. От параметров кайфую и жалею, что их нету в XML XPath
                    Цитата Павел Калугин @
                    Завсегда ж проще запрос в лоб собрать и execute
                    Это для Command :D . А для Query - ExecSQL :D .
                    ЗЫ - сорри за флуд...
                    Цитата Fr0sT @
                    А меня всегда бесили эти кавычки, которые в
                    Oracle. А у меня щяс инфа с ударениями. Как раз с символом ' :yes: . Так вместо него чего только не на вводили! Сижу, разгребаю...
                      Цитата jack128 @

                      Жнеь, ну это если давать пользователю запрос / параметры запроса с руки воодить ;)
                        Цитата #SI# @
                        Oracle. А у меня щяс инфа с ударениями. Как раз с символом '

                        А вот и попался! Апостроф, символ ударения и кавычка - это три совершенно разных символа (хотя кавычка иногда может служить в роли апострофа). А есть еще и модифицирующее ударение ))
                          Цитата mimo @
                          Как правильно создать запрос с учетом этих кавычек???

                          Можно вместо ручного закавычивания использовать ф-ю AnsiQuotedStr:
                          ExpandedWrap disabled
                            ADOQuery1.SQL.Text := Format('DELETE FROM dbbase WHERE ID=%s and NAME=%s',
                                                  [ListView1.Items[i].SubItems[6], AnsiQuotedStr(ListView1.Items[i].SubItems[1],'"')]);
                          Сообщение отредактировано: leo -
                            Цитата Fr0sT @
                            А вот и попался! Апостроф, символ ударения и кавычка - это три совершенно разных символа
                            Вот только операторам это по барабану - лепят ТО, что визуально соответствует данным.
                              #SI#, значит, надо фильтровать ввод.
                                Fr0sT ой не разбирал ты авгиевы конюшни за чужими программами....
                                Про ограничение ввода - это все классно но это мили/микро секунды (а то и больше) на каждую проверку. Соответственно всегда нужен баланс между количеством проверок и скоростью обработки. Не, если у тебя поток 2 записи в день - обпроверяйся. А если 2 записи в секунду тут уже решать что-то надо
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0464 ]   [ 17 queries used ]   [ Generated: 28.03.24, 14:00 GMT ]