Russian Qt Forum

Qt => Базы данных => Тема начата: BuRn от Октябрь 18, 2011, 17:56



Название: QSqlQuery не понятна ситуация
Отправлено: BuRn от Октябрь 18, 2011, 17:56
Цитировать
QSqlQuery query1("select * from orders where is_accepted=0 and is_cheked=0");
    query1.exec();
    QString name;
    while(query1.next())
    {
        int id=query1.value(0).toInt();
        name=query1.value(3).toString();
        QSqlQuery query2("update orders set is_cheked=1 where id=:id");
        query2.bindValue(":id",id);
        query2.exec();
        NewOrder *order = new NewOrder;
        qDebug()<<id;
        order->SetIDOrder(id);
        ui->tabWidget_2->addTab(order,name);
    }
запись в базе с флагами is_accepted и is_cheked единственная, но почему-то цикл while(query1.next()) крутится 2 раза да и в первый раз в переменной id мусор


Название: Re: QSqlQuery не понятна ситуация
Отправлено: Yuriy от Октябрь 18, 2011, 19:43
Обычно при построении запросов SQL числовые значения необходимо заключить в одинарные кавычки.
В вашем случае:

Код:
select * from orders where is_accepted='0' and is_cheked='0';


Название: Re: QSqlQuery не понятна ситуация
Отправлено: Yuriy от Октябрь 18, 2011, 19:52
И еще для читаемости кода лучше ключевые слова SQL писать заглавными буквами:
Код:
const QStrign strF= "SELECT * FROM orders WHERE is_accepted='%1' AND is_cheked='%2';";
const QString str = strF.arg(0).arg(0);

if (!query1.exec(str))
....

а то так с ходу и не разберешь что и куда SELECT, а потом забросы бывают не в одну и даже не в 10 строк и вот тогда точно копец.


Название: Re: QSqlQuery не понятна ситуация
Отправлено: BuRn от Октябрь 18, 2011, 22:59
и вот интересует сразу, а возможно ли биндить таблицы, что-то мне это не удалось


Название: Re: QSqlQuery не понятна ситуация
Отправлено: Yuriy от Октябрь 18, 2011, 23:09
Нужно описывать движок со своими делегатами.
У меня ушло на это приблизительно пол года, только это не API получилось, а самопальный движок с функционалом MS Access только я в нем могу описывать программы, а так черт ногу сломит. А вообще можно посмотреть готовые движки, есть же в инете всякие SQLite редакторы, основанные на Qt библиотеках.


Название: Re: QSqlQuery не понятна ситуация
Отправлено: RVZ от Октябрь 28, 2011, 14:07
Код
C++ (Qt)
const QStrign strF = QString("SELECT * FROM orders WHERE is_accepted=%1 AND is_cheked=%2;").arg(0).arg(0);

СОВСЕМ БРЕД КАКОЙТО!!!!!
Цитировать
QSqlQuery query1("select * from orders where is_accepted=0 and is_cheked=0");
    query1.exec();
    QString name;
    while(query1.next())
    {
        int id=query1.value(0).toInt();
        name=query1.value(3).toString();
        QSqlQuery query2("update orders set is_cheked=1 where id=:id");
        query2.bindValue(":id",id);
        query2.exec();
        NewOrder *order = new NewOrder;
        qDebug()<<id;
        order->SetIDOrder(id);
        ui->tabWidget_2->addTab(order,name);
    }


Название: Re: QSqlQuery не понятна ситуация
Отправлено: Пантер от Октябрь 28, 2011, 14:09
QSqlQuery query2("update orders set is_cheked=1 where id=:id");
замени на
QSqlQuery query2;
query2.prepare ("update orders set is_cheked=1 where id=:id");
И вынеси это из цикла.


Название: Re: QSqlQuery не понятна ситуация
Отправлено: andrew.k от Октябрь 30, 2011, 01:27
Не по теме, просто замечание.
У тебя запрос два раза выполняется.

"If query is not an empty string, it will be executed."
QSqlQuery (http://doc.qt.nokia.com/latest/qsqlquery.html#QSqlQuery-2)

UPD: В общем-то об этом Пантер и сказал)