Russian Qt Forum

Qt => Базы данных => Тема начата: sergun1604 от Июнь 06, 2011, 09:33



Название: После обновления Qt 4.7 не выполняется запрос sqlite
Отправлено: sergun1604 от Июнь 06, 2011, 09:33
Отцы давно не писал но опять к вам!
Проблема: Обновил Kubuntu до 11.04 с ней Qt
откомпилил приложение
перенес на ubuntu 10.04 (где оно раньше стояло)
пошли баги (при открытии некоторых окон прога вылетала)
скопировал с kubuntu на ubuntu либы кутешные и стал их использовать
Все завелось
Но теперь один единственный запрос на внесение записей не срабатывает. Хотя остальные идут норм.
На компе где креатор все компилится и обрабатывается классно без ошибок но вот на компе с убунтой не идет этот запрос.
Хотя в проге 4 подобных запроса и они норм обрабатываются.
вот запрос
Код:
QSqlQuery query5;
QString strF ="INSERT INTO tov (name, price, groop, margin, ed, koef, nds, pod, pricer) " "VALUES('%1', '%2', %3, '%4', '%5', '%6', %7, %8, '%9');";        //строка значений имя цена группа
QString str = strF.arg(name).arg(price).arg(groop).arg(margin).arg(ed).arg(koef).arg(nds).arg(pod).arg(pricer);
query5.exec(str);

хотя обновление работает
Код:
QString strF ="UPDATE tov SET name='%1', price='%2', groop=%3, margin='%4', ed= '%5', koef='%6', nds=%7, pod=%8, pricer='%9' " "WHERE id= %10";        //строка значений имя цена группа
        QString str = strF.arg(name).arg(price).arg(groop).arg(margin).arg(ed).arg(koef).arg(nds).arg(pod).arg(pricer).arg(n);

Измучился уже помогите кто может


Название: Re: После обновления Qt 4.7 не выполняется запрос sqlite
Отправлено: LisandreL от Июнь 06, 2011, 09:47
Ну вы бы привели код и текст ошибки, с которой запрос невыполняется.
Да и вообще неправильно (http://xkcd.ru/327/) так составлять запросы, надо через QSqlQuery::prepare и QSqlQuery::bindValue.


Название: Re: После обновления Qt 4.7 не выполняется запрос sqlite
Отправлено: sergun1604 от Июнь 06, 2011, 10:10
Во спасибо за направления.
В том то и дело что как посмотреть ошибку.
На компе на котором компилю все норм
а на том на которое приложение приношу как посмотришь?
через терминал запускал никаких ошибок не выдает

Попробую препаре и бинд валуе отпишусь


Название: Re: После обновления Qt 4.7 не выполняется запрос sqlite
Отправлено: sergun1604 от Июнь 06, 2011, 10:36
что то не так делаю?
Код:
query5.prepare("INSERT INTO tov (name)" "VALUES (:name)");
        query5.bindValue(":name",name);
query5.exec();

Запрос не проходит хелп


Название: Re: После обновления Qt 4.7 не выполняется запрос sqlite
Отправлено: LisandreL от Июнь 06, 2011, 10:46
а на том на которое приложение приношу как посмотришь?
Так вы выводите ошибку, если она произошла.
Код
C++ (Qt)
if ( query5.exec() )
{
   делаем что надо
}
else
{
   QMessageBox::critical( this, QString::number( (quint32) query5.lastError().type() ), query5.lastError().text() );
}


Название: Re: После обновления Qt 4.7 не выполняется запрос sqlite
Отправлено: Mikhail от Июнь 06, 2011, 11:21
Попробуй
query5.prepare("INSERT INTO tov (name) VALUES (:name)");
query5.bindValue(":name",name);
вместо
query5.prepare("INSERT INTO tov (name)" "VALUES (:name)");
query5.bindValue(":name",name1);

Ведь name - имя поля
name1 значение


Название: Re: После обновления Qt 4.7 не выполняется запрос s
Отправлено: Denjs от Июнь 06, 2011, 16:25
мне кажется в последнем листинге суть дела в разделителе. имхо надо
Код:
query5.prepare("INSERT INTO tov (name)" "VALUES (:name);");
вместо
Код:
query5.prepare("INSERT INTO tov (name)" "VALUES (:name)");

потому что где-то я уже такое отгребал с склайтом - что без разделителя - он думает что запрос ещё не закончен.
И проблема ваша мне кажется не в том что обновился Qt а в том, что SQLite обновился...

PS: а вот кстати к слову некоторые iSeries-ные версии DB2 как раз не хотят видеть разделитель... у каждого свои тараканы))))

ЗЗЫ: хотя вот в пером вашем листинге ";" вроде как присутсвует....
кстати - в почему у вас в середине строки зачем-то кавычки-пробел-кавычкистоят?
Код:
pod, pricer) " "VALUES('%1'
я просто не понимаю что это, простите...

ЗЗЫ: Ещё добавлю, что имена колонок лучше всего заключать в кавычки которые я именую "кавычки для имен столбцов".
для MySQL - это ` ("обратная одинарная кавычка" кажется). Для SQLite - это "  ("двойная простая кавычка" кажется)
Строковые значения - в кавычки для строк. для MySQL и SQLite - это ' ("простая одинарная кавычка" кажется).
Вы точно знаете/проверяли что name в новых версиях SQLite - это нифига не зарезервированное слово?

потому совсем правильно имхо будет даже
Код:
query5.prepare("INSERT INTO tov (\"name\") VALUES (':name');");


вот такое моё скромное имхо...


Название: Re: После обновления Qt 4.7 не выполняется запрос sqlite
Отправлено: sergun1604 от Июнь 07, 2011, 09:07
ребята спасибо вам но
код на проверку ошибки ни чего не выдает на убунтовском компе мол запрос выполнен
пробывал сейчас применять препаре
теперь еще смешнее
такой код
Код:
query5.prepare("INSERT INTO tov (name) VALUES (:name);");
query5.bindValue(":name",name);
if ( query5.exec() )
    {

    }
    else
    {
        QMessageBox::critical( this, QString::number( (quint32) query5.lastError().type() ), query5.lastError().text() );
    }
проходит без ошибок но не делает запись в базу теперь даже на компьюте где компилю приложение

если в ковычки ставить
Код:
query5.prepare("INSERT INTO tov (name) VALUES (':name');");
то пишет "Parameter count mismatch"
Я в тупике


Название: Re: После обновления Qt 4.7 не выполняется запрос sqlite
Отправлено: sergun1604 от Июнь 07, 2011, 09:52
так ну сейчас заработал с препаре проблема была в том что обязательно надо указывать все поля
буду эксперементить на компе с убунтой теперь


Название: Re: После обновления Qt 4.7 не выполняется запрос sqlite
Отправлено: sergun1604 от Июнь 07, 2011, 13:38
Все спасибо всем оказывается проблема была не в бобине.
Почему то на том компе не выполнялся кусок кода
в операторе if
было написано
if(m==1)
{
выполняется
}
else
{
невыполняется
}

написал заместо else
if(m==0)

глупость конечно но как этот баг отследишь. (жаль потраченного времени)

зато узнал про prepare