Russian Qt Forum
Июнь 15, 2024, 23:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt + Postgesql + символы апострофа и слеш  (Прочитано 15347 раз)
zharkov1977
Гость
« : Июнь 08, 2013, 15:13 »

Qt-шное приложение работает с базой данных Postgesql.
Пользователь через qplaintextedit пытается записать в таблицу Postgesql, составленный им SQL-запрос вида: select to_date('07.06.2013','DD.MM.RRRR') from DSA."TABLENAME"...
При попытке submit — ошибка, сообщающая что не нравятся символы апострофа и кавычек в запросе....
Напрямую, например через pgAdmib — такую запись можно запросто вставить.

Просто не совсем понятно, это qplaintextedit каким то образом преобразовывает текст?

Если запрос преобразовать к виду : select * from DSA."\TABLENAME"\ — то запись происходит...
Но это не решение проблемы, особенно для больших запросов...

Как решить данную проблему?
Записан
mutineer
Гость
« Ответ #1 : Июнь 08, 2013, 16:01 »

Почему не решение? Бери текст из textEdit и экранируй в нем кавычки перед отправкой в базу
Записан
zharkov1977
Гость
« Ответ #2 : Июнь 08, 2013, 16:36 »

Как " на лету"  экранировать?, т.е. чтобы пользователь вводил нормальный запрос, а перед записью - он "экранировался" ? Так еще и на апостроф ругается.....
Записан
mutineer
Гость
« Ответ #3 : Июнь 08, 2013, 17:08 »

Ну именно так - перед выполнением submit экранируй все проблемные символы
Записан
zharkov1977
Гость
« Ответ #4 : Июнь 08, 2013, 20:36 »

И все таки не совсем понял...

Это руками пользователь заэкранировал.... а как  сделать чтобы пользователь даже не задумывался об "экранировании"... То есть  как мне мапить текст запроса и экранировать его при записи? Замапить текст и перебирать посимвольно?

Если можно пример какой нибудь?



Записан
mutineer
Гость
« Ответ #5 : Июнь 08, 2013, 20:47 »

Например при помощи QString::replace() заменить во введенном тексте кавычки на \' и \" перед передачей строчки в базу. И пользователю не придется ни о чем задумываться
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Июнь 08, 2013, 20:57 »

что означает "замапить"?

В слоте, который отвечает за отправку данных в БД, замени в строке запроса символы " на \"
Записан

Юра.
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Июнь 09, 2013, 00:56 »

У вас есть слот, который берет текст из qplaintextedit и отправляет его.
перед отправкой того текста, делаете замену ' на \' и " на \"

т.е. будет что то вроде:
Код:
QPlainTextEdit textedit;
...
QString sendedText = textedit.toPlainText().replace("\"","\\\""); \\     " должна замениться на \"
...

Вроде должно правильно за экранировать, но не помешает в qDebug() вывести sendedText, перед тем как его действительно отправлять Смеющийся
Записан

Figaro
Гость
« Ответ #8 : Июнь 09, 2013, 04:24 »

Ну и как вариант биндить параметр через prepare и bindValue, по идее драйвер сам экранирует символы в зависимости от типа.
« Последнее редактирование: Июнь 09, 2013, 04:39 от Figaro » Записан
mutineer
Гость
« Ответ #9 : Июнь 09, 2013, 09:46 »

Ну и как вариант биндить параметр через prepare и bindValue, по идее драйвер сам экранирует символы в зависимости от типа.

А как узнать что из этого параметры?
Записан
isoul.zi
Гость
« Ответ #10 : Июнь 09, 2013, 14:23 »

У вас есть слот, который берет текст из qplaintextedit и отправляет его.
перед отправкой того текста, делаете замену ' на \' и " на \"

т.е. будет что то вроде:
Код:
QPlainTextEdit textedit;
...
QString sendedText = textedit.toPlainText().replace("\"","\\\""); \\     " должна замениться на \"
...

Вроде должно правильно за экранировать, но не помешает в qDebug() вывести sendedText, перед тем как его действительно отправлять Смеющийся

Это понятно....а если используется связка qsqltablemodel+qdatawidgetmapperНепонимающий
Да это не вариант. У меня подобная ситуация - только использую http://soci.sourceforge.net/, так эта либа сама вставляет : \' или \/.
И вообще почему такое происходит???
Записан
mutineer
Гость
« Ответ #11 : Июнь 09, 2013, 14:36 »

Такое происходит потому что в синтаксисе sql-запроса кавычки играют служебную роль. А чтобы показать что интерпретировать их не надо используется экранирование.

А какие проблемы с использованием этой связки?
Записан
isoul.zi
Гость
« Ответ #12 : Июнь 09, 2013, 15:10 »

Такое происходит потому что в синтаксисе sql-запроса кавычки играют служебную роль. А чтобы показать что интерпретировать их не надо используется экранирование.

А какие проблемы с использованием этой связки?

Такие же, как и у уважаемого zharkov1977...клиентское приложение написано на Qt. Доступ к базе осуществляется с помощью qsqltablemodel+qdatawidgetmapper.
Одно из значений ячейки(тип text) таблицы мапится в qplaintextedit-элемент, допустим я в эту ячейку забью c:\log\name.log, и засабмитю qdatawidgetmapper-элемент, то в таблице сохранится c:logname.log

з.ы. мне кажется что не все поняли вопроса zharkov1977
Записан
mutineer
Гость
« Ответ #13 : Июнь 09, 2013, 15:35 »

Переопредели QPlainTextEdit и в геттере проперти, которую использует qdatawidgetmapper заэкранируй слеши

з.ы. Да, не все поняли в чем проблема экранировать перед передачей
Записан
zharkov1977
Гость
« Ответ #14 : Июнь 09, 2013, 15:42 »

У меня тоже используется qsqltablemodel+qdatawidgetmapper,  просто вместо c:\log\name.log, у меня SQL - запрос, но в принципе ситуация такая же как и уважаемого isoul.zi....Вопрос как тогда сделать чтобы mapper "брал" текст и делал замену ' на \' и " на \"   как написал gil9red ?

Для  mutineer:

Экранировать через replace?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 22.