Название: 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; Вроде должно правильно за экранировать, но не помешает в 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; Вроде должно правильно за экранировать, но не помешает в 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): Ответил только потому, что у самого были проблемы с PostgreSQL... Пришлось дебаггером иметь драйвер... Но это уже мои личные проблемы... Название: Re: Qt + Postgesql + символы апострофа и слеш Отправлено: mutineer от Июня 09, 2013, 16:11 А как узнать что из этого параметры? Что т вроде этого см Assistant: Код: Binding values using positional placeholders (version 1): Ответил только потому, что у самого были проблемы с 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"... там не в параметрах дело, а то что составленный им запрос в форме приложения сохраняется в базу PG без апострофов. При попытке submit — ошибка, сообщающая что не нравятся символы апострофа и кавычек в запросе.... Ссылку на что? Судя по доке для записи и чтения данных в виджет QDataWidgetMapper использует проперти, которое ему можно сказать при маппинге. Название: Re: Qt + Postgesql + символы апострофа и слеш Отправлено: mutineer от Июня 09, 2013, 16:25 Ну это понятно в случае, если ты знаешь что за запрос. Но у ТС запрос полностью вводит пользователь, там хз что параметры, а что нет Я все таки считаю что вопрос не в этом - ТС , по его словам: Пользователь через qplaintextedit пытается записать в таблицу Postgesql, составленный им SQL-запрос вида: select to_date('07.06.2013','DD.MM.RRRR') from DSA."TABLENAME"... там не в параметрах дело, а то что составленный им запрос в форме приложения сохраняется в базу PG без апострофов. При попытке submit — ошибка, сообщающая что не нравятся символы апострофа и кавычек в запросе.... Ссылку на что? Судя по доке для записи и чтения данных в виджет 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....
т.е нормально обрабатываются и апострофы и слеши... |