Russian Qt Forum

Qt => Базы данных => Тема начата: kadr от Октябрь 26, 2009, 14:11



Название: не работает INSERT
Отправлено: kadr от Октябрь 26, 2009, 14:11
Знаю что уже где то писал про это, но не смог найти, в общем проблема в следующем:
q.prepare("INSERT INTO uralbiofarm (code,name,zavod,kolvo,price,fasovka,postavcik) VALUES (:id,:name,:proizvod,:kol,:chena,:fasov,:postavcik)");
            q.bindValue(":id", i);
            q.bindValue(":name", name);
            q.bindValue(":proizvod", proizvod);
            q.bindValue(":kol", kol);
            q.bindValue(":chena", chena);
            q.bindValue(":fasov", fasov);
            q.bindValue(":postavcik", tr("Уралбиофарм"));
            q.exec();
На винде не работает, дома линухе без проблем работает,  когда за место VALUES (:id,:name,:proizvod,:kol,:chena,:fasov,:postavcik) ставишь например VALUES ('1','Имя какое нибудь','производитель','5','54.21','52','поставщик'), то все нормально добавляется в базу, а через переменные не хочет!
В переменных данные есть и они нормально выводятся на консоль!


Название: Re: не работает INSERT
Отправлено: Aleksey_Zh от Октябрь 26, 2009, 14:25
Знаю что уже где то писал про это, но не смог найти, в общем проблема в следующем:
q.prepare("INSERT INTO uralbiofarm (code,name,zavod,kolvo,price,fasovka,postavcik) VALUES (:id,:name,:proizvod,:kol,:chena,:fasov,:postavcik)");
            q.bindValue(":id", i);
            q.bindValue(":name", name);
            q.bindValue(":proizvod", proizvod);
            q.bindValue(":kol", kol);
            q.bindValue(":chena", chena);
            q.bindValue(":fasov", fasov);
            q.bindValue(":postavcik", tr("Уралбиофарм"));
            q.exec();
На винде не работает, дома линухе без проблем работает,  когда за место VALUES (:id,:name,:proizvod,:kol,:chena,:fasov,:postavcik) ставишь например VALUES ('1','Имя какое нибудь','производитель','5','54.21','52','поставщик'), то все нормально добавляется в базу, а через переменные не хочет!
В переменных данные есть и они нормально выводятся на консоль!

Проверял правильность конечного запроса?
Попробуй формировать запрос через QString(%1,%2...).arg();


Название: Re: не работает INSERT
Отправлено: break от Октябрь 26, 2009, 14:28
Если в Linux работает то вероятно запрос правильный...
Что за БД - возможно ошибка в виндовой версии Qt-шного драйвера, по крайней мере так вроде все правильно, нга FB аналогичные запросы кработают.


Название: Re: не работает INSERT
Отправлено: Aleksey_Zh от Октябрь 26, 2009, 14:45
Если в Linux работает то вероятно запрос правильный...

дома линухе без проблем работает,  когда за место VALUES (:id,:name,:proizvod,:kol,:chena,:fasov,:postavcik) ставишь например VALUES ('1','Имя какое нибудь','производитель','5','54.21','52','поставщик')

Не факт, что запрос верный... В линухе подставляли конкретные значения... Я так с мускулем 1 раз мучался... Такая же проблема была. Теперь каждый запрос проверяю...


Название: Re: не работает INSERT
Отправлено: kadr от Октябрь 26, 2009, 15:15
Если в Linux работает то вероятно запрос правильный...
Что за БД - возможно ошибка в виндовой версии Qt-шного драйвера, по крайней мере так вроде все правильно, нга FB аналогичные запросы кработают.
MySQL, здесь на винде тоже добавляет если конкретно указывать значения!


Название: Re: не работает INSERT
Отправлено: break от Октябрь 26, 2009, 15:21
Цитировать
MySQL, здесь на винде тоже добавляет если конкретно указывать значения!
Да я так и понял что на винде работает только с подстановкой значений а в линукс и так и так - мне кажется все таки что ошибка в реализации драйыера БД под винду - какая версия QT?


Название: Re: не работает INSERT
Отправлено: Aleksey_Zh от Октябрь 26, 2009, 15:38
Цитировать
MySQL, здесь на винде тоже добавляет если конкретно указывать значения!
Да я так и понял что на винде работает только с подстановкой значений а в линукс и так и так - мне кажется все таки что ошибка в реализации драйыера БД под винду - какая версия QT?

А если попробовать по другому сделать запрос? Например
QString("INSERT INTO uralbiofarm VALUES (%1,%2,%3,%4,%5,%6,'%7');")
.arg(i)
.arg(name)
.arg(proizvod)
.arg(kol)
.arg(chena)
.arg(fasov)
.arg("Уралбиофарм")
;

Отпишись, может получится!


Название: Re: не работает INSERT
Отправлено: kadr от Октябрь 26, 2009, 15:46
Цитировать
MySQL, здесь на винде тоже добавляет если конкретно указывать значения!
Да я так и понял что на винде работает только с подстановкой значений а в линукс и так и так - мне кажется все таки что ошибка в реализации драйыера БД под винду - какая версия QT?
я дрова в нете качнул, так как не смог скомпилить, а так 4,6


Название: Re: не работает INSERT
Отправлено: Aleksey_Zh от Октябрь 26, 2009, 15:56
Вы так увлеклись темой о том, что дрова косячные, что не хотите рассматривать другие варианты! Дрова вполне возможно нормальные! Проверьте синтаксис!!!!!!!!!!!!!!!! Я например заметил, что поставщика (который скорее всего типа varchar), написали без кавычек! Мускуль такое не простит! проверьте орфографию!!!!!!!! >:(


Название: Re: не работает INSERT
Отправлено: kadr от Октябрь 26, 2009, 16:17
Вы так увлеклись темой о том, что дрова косячные, что не хотите рассматривать другие варианты! Дрова вполне возможно нормальные! Проверьте синтаксис!!!!!!!!!!!!!!!! Я например заметил, что поставщика (который скорее всего типа varchar), написали без кавычек! Мускуль такое не простит! проверьте орфографию!!!!!!!! >:(
Как без ковычек q.bindValue(":postavcik",tr("Уралбиофарм"));
Вроде с кавычками, такое ощущение что проблема действительно в синтаксе, ведь если подставить точные значения, то все нормально заноситься!


Название: Re: не работает INSERT
Отправлено: kadr от Октябрь 26, 2009, 16:19
Цитировать
MySQL, здесь на винде тоже добавляет если конкретно указывать значения!
Да я так и понял что на винде работает только с подстановкой значений а в линукс и так и так - мне кажется все таки что ошибка в реализации драйыера БД под винду - какая версия QT?

А если попробовать по другому сделать запрос? Например
QString("INSERT INTO uralbiofarm VALUES (%1,%2,%3,%4,%5,%6,'%7');")
.arg(i)
.arg(name)
.arg(proizvod)
.arg(kol)
.arg(chena)
.arg(fasov)
.arg("Уралбиофарм")
;

Отпишись, может получится!
Не совсем понял как это работает, как мне выполнить этот запрос то?


Название: Re: не работает INSERT
Отправлено: Aleksey_Zh от Октябрь 26, 2009, 16:24
QSqlQuery Qr;
QString SQL=QString("INSERT INTO uralbiofarm VALUES (%1,'%2','%3',%4,%5,%6,'%7');")
.arg(i)
.arg(name)
.arg(proizvod)
.arg(kol)
.arg(chena)
.arg(fasov)
.arg("Уралбиофарм")
;
Qr.exec(SQL);

Попробуйте так. Должно заработать. Короче все текстовые переменные в скобках заключайте в апострофы '%n'


Название: Re: не работает INSERT
Отправлено: kadr от Октябрь 26, 2009, 16:34
ДА реально работает, странно в линуксе один синтаксис работает в винде другой. Спасибо!


Название: Re: не работает INSERT
Отправлено: Aleksey_Zh от Октябрь 26, 2009, 16:40
Если что, стучись в личку. Я тоже на мускуле сижу.  :)


Название: Re: не работает INSERT
Отправлено: MoPDoBoPoT от Октябрь 26, 2009, 17:53
Конструкции prepare-bindValue-exec и QString-agr-exec в общем случае различны. Если СУБД поддерживает связываемые переменные (функция QSqlDriver::hasFeature(QSqlDriver::PreparedQueries) вернет true), то в некоторых случаях prepare-bindValue-exec будет предпочтительней, а именно  - когда очень часто используется, по сути, один и тот же запрос, но с разными подставляемыми данными (тот же INSERT, например). При использовании связываемых переменных запрос компилируется один раз, а затем план его выполнения запоминается в библиотечном кэше, из которого его можно выбрать для повторного выполнения (с новыми подставляемыми значениями). Да и для АБД статистику проще собирать.


Название: Re: не работает INSERT
Отправлено: BaltikS от Октябрь 26, 2009, 18:14
Конструкции prepare-bindValue-exec и QString-agr-exec в общем случае различны. Если СУБД поддерживает связываемые переменные (функция QSqlDriver::hasFeature(QSqlDriver::PreparedQueries) вернет true), то в некоторых случаях prepare-bindValue-exec будет предпочтительней, а именно  - когда очень часто используется, по сути, один и тот же запрос, но с разными подставляемыми данными (тот же INSERT, например). При использовании связываемых переменных запрос компилируется один раз, а затем план его выполнения запоминается в библиотечном кэше, из которого его можно выбрать для повторного выполнения (с новыми подставляемыми значениями). Да и для АБД статистику проще собирать.
+1
Qt  - не причём. Библиотека мускульная....