Russian Qt Forum

Qt => Базы данных => Тема начата: aliks-os от Ноябрь 26, 2009, 15:37



Название: QSqlQuery, Количество строк при обновлении
Отправлено: aliks-os от Ноябрь 26, 2009, 15:37
Могу ли я узнать сколько записей затронуто при обновлении, пытался сделать таким образом, но что не получилось

QSqlQuery query;
    query.prepare("UPDATE person_object SET person_id "+record->value("id").toString()+
                  " WHERE person_type_id=1 AND obj_id="+innerRecord->value("id").toString());
    query.exec();
    qDebug()<<query.numRowsAffected();


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: BRE от Ноябрь 26, 2009, 15:41
int QSqlQuery::size () const


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: aliks-os от Ноябрь 26, 2009, 15:44
Возвращает -1 ???


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: MoPDoBoPoT от Ноябрь 26, 2009, 15:48
А запрос вообще проходит? Ошибок нет?
По-моему знака "=" не хватает:
query.prepare("UPDATE person_object SET person_id =  "+record->value("id").toString()+
                  " WHERE person_type_id=1 AND obj_id="+innerRecord->value("id").toString());


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: BRE от Ноябрь 26, 2009, 15:49
Значит, база данных (драйвер) не может определять количество строк в ответе или запрос не активен.

bool QSqlDriver::hasFeature ( DriverFeature feature ) const   [pure virtual]
Цитировать
QSqlDriver::QuerySize   1   Whether the database is capable of reporting the size of a query. Note that some databases do not support returning the size (i.e. number of rows returned) of a query, in which case QSqlQuery::size() will return -1.

Попробуй сделать:
Код
C++ (Qt)
       m_size = 0;
       if( m_query->exec() )
               if( m_query->last() )
                       m_size = m_query->at() + 1;
 


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: MoPDoBoPoT от Ноябрь 26, 2009, 15:53
А причем здесь QSqlQuery::size()?  Ведь:
Цитата: QtAssistant
To determine the number of rows affected by a non-SELECT statement, use numRowsAffected().


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: aliks-os от Ноябрь 26, 2009, 16:02
да, знак вопроса был пропущен, исправил, но все равно без результата

а этот код мне вернул 0

m_size = 0;
        if( m_query->exec() )
                if( m_query->last() )
                        m_size = m_query->at() + 1;

я то же думаю что size это не верно


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: BRE от Ноябрь 26, 2009, 16:09
я то же думаю что size это не верно
Да, я пропустил, что делается UPDATE, а не SELECT.

Так а что тебе возвращает  qDebug()<<query.numRowsAffected();


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: MoPDoBoPoT от Ноябрь 26, 2009, 16:12
Что означает без результата?  query.numRowsAffected() возвращает -1?


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: aliks-os от Ноябрь 26, 2009, 16:17
 сейчас заработало все как надо, привожу полный код


    QSqlQuery query;
    query.prepare("UPDATE person_object SET person_id ="+record->value("id").toString()+
                  " WHERE person_type_id=1 AND obj_id="+innerRecord->value("id").toString());
    query.exec();
    if (query.numRowsAffected() < 1) {
        query.prepare("INSERT INTO person_object (obj_id, person_id, person_type_id) "
                      "VALUES (:obj_id, :person_id, :person_type_id)");
        query.bindValue(":obj_id", innerRecord->value("id").toInt());
        query.bindValue(":person_id", record->value("id").toInt());
        query.bindValue(":person_type_id", 1);
        query.exec();
    }


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: break от Декабрь 02, 2009, 00:45
А вам случаем не надо было использовать "Update or Insert statement" -- если конечно поддерживается в сервере...


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: aliks-os от Март 05, 2010, 12:03
А вам случаем не надо было использовать "Update or Insert statement" -- если конечно поддерживается в сервере...

Не уловил, можно ли об этом подробнее?


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: break от Март 05, 2010, 12:08
Есть такая конструкция в некоторых серверах, которая выглядит так

update or insert into MY_TABLE( FIELD_1, FIELD_2 )
values ( :VALUE_FIELD_1, :VALUE_FIELD_2 )
matching( MACHING_FIELD_1, MACHING_FIELD_2 )

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


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: aliks-os от Март 05, 2010, 12:30
Я использую MySQL, там такого нет, но все равно спасибо за подсказку. А не подскажите в каких серверах можно использовать такую конструкцию?


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: break от Март 05, 2010, 13:19
я работаю с Firebird  -там можно - не помню когда ввели но в 2.1 точно работает (думаю и в Interbase тоже должно быть )


Название: Re: QSqlQuery, Количество строк при обновлении
Отправлено: Kolobok от Март 06, 2010, 10:54
Я использую MySQL, там такого нет


http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
 (http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html)