Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: zharkov1977 от Июня 08, 2013, 15:13



Название: Qt + Postgesql + символы апострофа и слеш
Отправлено: 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"\ — то запись происходит...
Но это не решение проблемы, особенно для больших запросов...

Как решить данную проблему?


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 08, 2013, 16:01
Почему не решение? Бери текст из textEdit и экранируй в нем кавычки перед отправкой в базу


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: zharkov1977 от Июня 08, 2013, 16:36
Как " на лету"  экранировать?, т.е. чтобы пользователь вводил нормальный запрос, а перед записью - он "экранировался" ? Так еще и на апостроф ругается.....


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 08, 2013, 17:08
Ну именно так - перед выполнением submit экранируй все проблемные символы


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: zharkov1977 от Июня 08, 2013, 20:36
И все таки не совсем понял...

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

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





Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 08, 2013, 20:47
Например при помощи QString::replace() заменить во введенном тексте кавычки на \' и \" перед передачей строчки в базу. И пользователю не придется ни о чем задумываться


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: lit-uriy от Июня 08, 2013, 20:57
что означает "замапить"?

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


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: gil9red от Июня 09, 2013, 00:56
У вас есть слот, который берет текст из qplaintextedit и отправляет его.
перед отправкой того текста, делаете замену ' на \' и " на \"

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

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


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: Figaro от Июня 09, 2013, 04:24
Ну и как вариант биндить параметр через prepare и bindValue, по идее драйвер сам экранирует символы в зависимости от типа.


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 09, 2013, 09:46
Ну и как вариант биндить параметр через prepare и bindValue, по идее драйвер сам экранирует символы в зависимости от типа.

А как узнать что из этого параметры?


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: isoul.zi от Июня 09, 2013, 14:23
У вас есть слот, который берет текст из qplaintextedit и отправляет его.
перед отправкой того текста, делаете замену ' на \' и " на \"

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

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

Это понятно....а если используется связка qsqltablemodel+qdatawidgetmapper???
Да это не вариант. У меня подобная ситуация - только использую http://soci.sourceforge.net/ (http://soci.sourceforge.net/), так эта либа сама вставляет : \' или \/.
И вообще почему такое происходит???


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 09, 2013, 14:36
Такое происходит потому что в синтаксисе sql-запроса кавычки играют служебную роль. А чтобы показать что интерпретировать их не надо используется экранирование.

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


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: isoul.zi от Июня 09, 2013, 15:10
Такое происходит потому что в синтаксисе sql-запроса кавычки играют служебную роль. А чтобы показать что интерпретировать их не надо используется экранирование.

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

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

з.ы. мне кажется что не все поняли вопроса zharkov1977


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 09, 2013, 15:35
Переопредели QPlainTextEdit и в геттере проперти, которую использует qdatawidgetmapper заэкранируй слеши

з.ы. Да, не все поняли в чем проблема экранировать перед передачей


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: zharkov1977 от Июня 09, 2013, 15:42
У меня тоже используется qsqltablemodel+qdatawidgetmapper,  просто вместо c:\log\name.log, у меня SQL - запрос, но в принципе ситуация такая же как и уважаемого isoul.zi....Вопрос как тогда сделать чтобы mapper "брал" текст и делал замену ' на \' и " на \"   как написал gil9red ?

Для  mutineer:

Экранировать через replace?


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 09, 2013, 15:45
У меня тоже используется qsqltablemodel+qdatawidgetmapper,  просто вместо c:\log\name.log, у меня SQL - запрос, но в принципе ситуация такая же как и уважаемого isoul.zi....Вопрос как тогда сделать чтобы mapper "брал" текст и делал замену ' на \' и " на \"   как написал gil9red ?

Для  mutineer:

Экранировать через replace?

Телепаты в перманентном отпуске, надо сразу говорить такие вещи. Судя по доке для записи и чтения данных в виджет QDataWidgetMapper использует проперти, которое ему можно сказать при маппинге. Соответственно используя мой предыдущий комментарий и, например, replace, можно заэкранировать нужные символы


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: lit-uriy от Июня 09, 2013, 16:01
Я что-то не пойму, если используется Мапер то как пользователь вообще запрос пишет?
Мапер всего-лишь отображает содержимое поля на виджет, а не запрос к БД


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: isoul.zi от Июня 09, 2013, 16:04

Телепаты в перманентном отпуске, надо сразу говорить такие вещи. Судя по доке для записи и чтения данных в виджет QDataWidgetMapper использует проперти, которое ему можно сказать при маппинге. Соответственно используя мой предыдущий комментарий и, например, replace, можно заэкранировать нужные символы

можете ссылку(не нашел)? я собирался через делегат двигаться..


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: Figaro от Июня 09, 2013, 16:09

А как узнать что из этого параметры?

Что т вроде этого см Assistant:

Код:
Binding values using positional placeholders (version 1):

     QSqlQuery query;
     query.prepare("INSERT INTO person (id, forename, surname) "
                   "VALUES (?, ?, ?)");
     query.bindValue(0, 1001);
     query.bindValue(1, "Bart");
     query.bindValue(2, "Simpson");
     query.exec();
Binding values using positional placeholders (version 2):

     QSqlQuery query;
     query.prepare("INSERT INTO person (id, forename, surname) "
                   "VALUES (?, ?, ?)");
     query.addBindValue(1001);
     query.addBindValue("Bart");
     query.addBindValue("Simpson");
     query.exec();

Ответил только потому, что у самого были проблемы с PostgreSQL... Пришлось дебаггером иметь драйвер... Но это уже мои личные проблемы...


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 09, 2013, 16:11

А как узнать что из этого параметры?

Что т вроде этого см Assistant:

Код:
Binding values using positional placeholders (version 1):

     QSqlQuery query;
     query.prepare("INSERT INTO person (id, forename, surname) "
                   "VALUES (?, ?, ?)");
     query.bindValue(0, 1001);
     query.bindValue(1, "Bart");
     query.bindValue(2, "Simpson");
     query.exec();
Binding values using positional placeholders (version 2):

     QSqlQuery query;
     query.prepare("INSERT INTO person (id, forename, surname) "
                   "VALUES (?, ?, ?)");
     query.addBindValue(1001);
     query.addBindValue("Bart");
     query.addBindValue("Simpson");
     query.exec();

Ответил только потому, что у самого были проблемы с PostgreSQL... Пришлось дебаггером иметь драйвер... Но это уже мои личные проблемы...

Ну это понятно в случае, если ты знаешь что за запрос. Но у ТС запрос полностью вводит пользователь, там хз что параметры, а что нет


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 09, 2013, 16:12

Телепаты в перманентном отпуске, надо сразу говорить такие вещи. Судя по доке для записи и чтения данных в виджет QDataWidgetMapper использует проперти, которое ему можно сказать при маппинге. Соответственно используя мой предыдущий комментарий и, например, replace, можно заэкранировать нужные символы

можете ссылку(не нашел)? я собирался через делегат двигаться..

Ссылку на что?


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 09, 2013, 16:19
Я что-то не пойму, если используется Мапер то как пользователь вообще запрос пишет?
Мапер всего-лишь отображает содержимое поля на виджет, а не запрос к БД

Похоже что запрос записывается в таблицу, а не выполняется. В чем смысл действа сего - тайна, покрытая мраком:)


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: isoul.zi от Июня 09, 2013, 16:22
Ну это понятно в случае, если ты знаешь что за запрос. Но у ТС запрос полностью вводит пользователь, там хз что параметры, а что нет

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

Ссылку на что?

Судя по доке для записи и чтения данных в виджет QDataWidgetMapper использует проперти, которое ему можно сказать при маппинге.


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 09, 2013, 16:25
Ну это понятно в случае, если ты знаешь что за запрос. Но у ТС запрос полностью вводит пользователь, там хз что параметры, а что нет

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

Ссылку на что?

Судя по доке для записи и чтения данных в виджет QDataWidgetMapper использует проперти, которое ему можно сказать при маппинге.

1) Да, точно, думал сначала что в самом запросе надо параметры биндить

2) Не думаю что нужна ссылка на доку, она ведь гуглится проще, чем этот форум


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: isoul.zi от Июня 09, 2013, 17:11
Переопредели QPlainTextEdit и в геттере проперти, которую использует qdatawidgetmapper заэкранируй слеши

если честно у меня эт первый опыт работы с qdatawidgetmapper...не совсем понятно геттере проперти, которую использует qdatawidgetmapper


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 09, 2013, 17:17
Почитай про Q_PROPERTY


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: zharkov1977 от Июня 09, 2013, 20:12
Извините что отвечаю не сразу,  но у меня пользователь должен через интерфейс(qsqltablemodel+qdatawidgetmappe) составить(QPlaintext) и сохранить сам запрос в ячейку(text) таблицы Postgesql, и запрос пользователь может составить в принципе любой...

Да дело в том что при сохранении он сохраняет без апострофов, и слешей...как я уже писал ранее, то есть пользователь составляет запрос - у меня данный запрос должен обработаться приложением, а так получается что при сохранении теряется весь смысл  записи... :

select to_date(07.06.2013,DD.MM.RRRR) from DSA.TABLENAME

Приложение берет  из таблицы для обработки пользовательский запрос и соответственно валится из-за этих апострофов и кавычек...
Т.е. мне надо чтобы запрос как ввел пользователь со спецсимволами в QPlaintext - так его и записать без потери чего либо....

У меня тоже не очень большой опыт с qdatawidgetmappe, и не очень понимаю как использовать в данном случае Q_PROPERTY


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: mutineer от Июня 09, 2013, 20:46
qdatawidgetmapper для забирания данных из виджета использует QObject::зroperty(...). При этом вызывается метод, указанный в секции READ макроса Q_PROPERTY. Вот в этом методе экранирование и выполняй


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: lit-uriy от Июня 10, 2013, 02:21
Так вроде соль проявляется на поверхности.
zharkov1977 давай разбирать твою систему по косточкам:
1) В БД всё помещается как надо, т.к. Мапер туп совершенно, что пользователь написал, то он и сохранил в БД.
Т.е. если пользователь ввёл кавычки, то в БД они и сохранятся.

2)При чтении из БД строки запроса и последующего выполнения этого запроса возникает казус с кавычками.
нужно разобратся, как сейчас реализовано выполнение запроса.


Название: Re: Qt + Postgesql + символы апострофа и слеш
Отправлено: zharkov1977 от Июня 10, 2013, 06:57
Спасибо за помощь , но решилось все установкой драйвера PostgreSQL Unicode, ранее был PostgreSQL ANSI....
т.е нормально обрабатываются и апострофы и слеши...