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

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

                        А вот и попался! Апостроф, символ ударения и кавычка - это три совершенно разных символа (хотя кавычка иногда может служить в роли апострофа). А есть еще и модифицирующее ударение ))
                        Codero ergo sum
                        // Программирую — значит, существую
                          Цитата 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#, значит, надо фильтровать ввод.
                              Codero ergo sum
                              // Программирую — значит, существую
                                Fr0sT ой не разбирал ты авгиевы конюшни за чужими программами....
                                Про ограничение ввода - это все классно но это мили/микро секунды (а то и больше) на каждую проверку. Соответственно всегда нужен баланс между количеством проверок и скоростью обработки. Не, если у тебя поток 2 записи в день - обпроверяйся. А если 2 записи в секунду тут уже решать что-то надо
                                  Цитата Павел Калугин @
                                  Fr0sT ой не разбирал ты авгиевы конюшни за чужими программами....
                                  Это точно!
                                    Павел Калугин, да, не доводилось, признаю. Но едва ли стоит гордиться подобным опытом разгребания, если введение предварительной фильтрации могло бы полностью его исключить. Хотя не исключаю ситуации, когда это невозможно либо слишком затратно.
                                    Codero ergo sum
                                    // Программирую — значит, существую
                                      Fr0sT От на сто процентов ты прав. Но иногда задача выглядит так
                                      Вот наша старая программка. Надо доработать функционал ... ... ... (стопицот страниц требований) И ни в коем случае не потерять дань за 12 лет накопленные со времен царя Гороха данные.
                                      И вот тогда и мать вспомнишь и прабабку того разработчика, который эту программку во времена царя Гороха на коленке слепил...
                                      Советы ввод ограничить, хороши для новой разработки. Но для приведения данных к новому стандарту они, увы, не пригодны
                                        Цитата Fr0sT @
                                        введение предварительной фильтрации могло бы полностью его исключить
                                        ППКС! О чём речь! Вот только почему-то не включили. Видно забыли. А я щяс разгребаю. Если не боишься измазаться - подфорум Oracle за последние 2 года здорово подрос на моих темах.
                                        Цитата Павел Калугин @
                                        ни в коем случае не потерять ... за 12 лет накопленные со времен царя Гороха данные
                                        За 15 лет, Павел... А всё остальное ты правильно определил. :D
                                        ---
                                        Кстати о кавычках - в качестве символа ударения нашёл тильды. Вот так вот.
                                        Сообщение отредактировано: #SI# -
                                          Цитата #SI# @
                                          в качестве символа ударения нашёл тильды

                                          Жали шифт когда не надо, что ли?

                                          Добавлено
                                          Честно говоря, почитал твои темы и не нашел особых заморочек. Тем более что у тебя операция по разгребанию разовая, и ее можно выполнять итерационно.
                                          Codero ergo sum
                                          // Программирую — значит, существую
                                            Цитата Павел Калугин @
                                            Но для приведения данных к новому стандарту они, увы, не пригодны

                                            Так они обычно одноразовые , можно и потерпеть.
                                            Другое дело когда данные приходят от царя Гороха, и никто не помнит кто это написал и исходников не оставил.
                                            Цель - ничто , процесс - все.
                                              Bas Если исходники есть это уже сродни чуду. А если еще и разработчик доступен, который это писал лет цать назад это даже не чудо это просто праздник какойто :) У меня щас каждая вторая задача это перенос какого-нибудь старого функционала в новую систему.... Лепота...
                                              Сообщение отредактировано: Павел Калугин -
                                                Ладно, братцы, уже флуд пошёл... :whistle:
                                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                0 пользователей:


                                                Рейтинг@Mail.ru
                                                [ Script Execution time: 0,4374 ]   [ 18 queries used ]   [ Generated: 27.04.18, 06:32 GMT ]