Russian Qt Forum
Ноябрь 24, 2024, 09:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QSqlQuery, Количество строк при обновлении  (Прочитано 12063 раз)
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();
Записан
BRE
Гость
« Ответ #1 : Ноябрь 26, 2009, 15:41 »

int QSqlQuery::size () const
Записан
aliks-os
Гость
« Ответ #2 : Ноябрь 26, 2009, 15:44 »

Возвращает -1 Непонимающий
Записан
MoPDoBoPoT
Гость
« Ответ #3 : Ноябрь 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());
Записан
BRE
Гость
« Ответ #4 : Ноябрь 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;
 
Записан
MoPDoBoPoT
Гость
« Ответ #5 : Ноябрь 26, 2009, 15:53 »

А причем здесь QSqlQuery::size()?  Ведь:
Цитата: QtAssistant
To determine the number of rows affected by a non-SELECT statement, use numRowsAffected().
Записан
aliks-os
Гость
« Ответ #6 : Ноябрь 26, 2009, 16:02 »

да, знак вопроса был пропущен, исправил, но все равно без результата

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

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

я то же думаю что size это не верно
Записан
BRE
Гость
« Ответ #7 : Ноябрь 26, 2009, 16:09 »

я то же думаю что size это не верно
Да, я пропустил, что делается UPDATE, а не SELECT.

Так а что тебе возвращает  qDebug()<<query.numRowsAffected();
Записан
MoPDoBoPoT
Гость
« Ответ #8 : Ноябрь 26, 2009, 16:12 »

Что означает без результата?  query.numRowsAffected() возвращает -1?
Записан
aliks-os
Гость
« Ответ #9 : Ноябрь 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();
    }
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #10 : Декабрь 02, 2009, 00:45 »

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

А вам случаем не надо было использовать "Update or Insert statement" -- если конечно поддерживается в сервере...

Не уловил, можно ли об этом подробнее?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #12 : Март 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 - то сервер попытается найти запись с значением этого ключа - если она есть обновит ее, иначе вставит
Записан
aliks-os
Гость
« Ответ #13 : Март 05, 2010, 12:30 »

Я использую MySQL, там такого нет, но все равно спасибо за подсказку. А не подскажите в каких серверах можно использовать такую конструкцию?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #14 : Март 05, 2010, 13:19 »

я работаю с Firebird  -там можно - не помню когда ввели но в 2.1 точно работает (думаю и в Interbase тоже должно быть )
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 23.