Для получения количества обработанных записей запросом (insert, update, delete) в Qt используют функцию numRowsAffected(), а для получения размера выборки — size() объекта QSqlQuery:
[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aif%20(!query.exec(%22delete%20from%20people%20where%20age%20%3C%2020%22))%20%7B%0A%09qDebug()%20%3C%3C%20%22error%3A%22%20%3C%3C%20query.lastError()-%3Etext()%3B%0A%09return%3B%0A%7D%0AqDebug()%20%3C%3C%20%22rows%20count%22%20%3C%3C%20query.numRowsAffected()%3B» message=»numRowsAffected()» highlight=»6″ provider=»manual»/]
[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aif%20(!query.exec(%22select%20*%20from%20people%20where%20age%20%3C%2035%22))%20%7B%0A%09qDebug()%20%3C%3C%20%22error%3A%22%20%3C%3C%20query.lastError()-%3Etext()%3B%0A%09return%3B%0A%7D%0AqDebug()%20%3C%3C%20%22rows%20count%22%20%3C%3C%20query.size()%3B» message=»size()» highlight=»6″ provider=»manual»/]
Но не все СУБД поддерживают эту функцию. Например, SQLite и, о Боже! — Microsoft SQL Server (как не стыдно!). Проверить поддержку данной функции (а заодно и функции QSqlQuery::size()) можно так:
[pastacode lang=»cpp» manual=»qDebug()%20%3C%3C%20database.driver()-%3EhasFeature(QSqlDriver%3A%3AQuerySize)%3B» message=»» highlight=»» provider=»manual»/]
где database — объект подключения к базе данных QSqlDatabase. Если в выводе приложения вы увидите false, то прогноз пессимистичен.
Что делать в этом случае?
Есть пара способов.
Первый (для QSqlQuery::size()): позиционируемся на последней записи в наборе и получаем ее индекс +1:
[pastacode lang=»cpp» manual=»int%20rowsCount%20%3D%200%3B%0Aif%20(query.last())%20%0A%09rowsCount%20%3D%20query.at()%20%2B%201%3B%0AqDebug()%20%3C%3C%20%22query%20size%3A%22%20%3C%3C%20rowsCount%3B» message=»» highlight=»» provider=»manual»/]
Чтобы вернуться в начало набора данных воспользуемся функциями first() и previous():
[pastacode lang=»cpp» manual=»query.first()%3B%0Aquery.previous()%3B%20″ message=»» highlight=»» provider=»manual»/]
Второй: делаем запрос к БД. Например, перед удалением сначала проверяем, сколько записей подпадают под критерии. В случае с вставкой и обновлением этот метод может оказаться ненадежным, т.к. в таблице могут оказаться старые записи, удовлетворяющие заданным критериям. Но можно сделать запрос перед операцией вставки или обновления и после операции. Зтаем сравнить результаты и сделать выводы о количестве обработанных записей.
Оба способа работают медленнее стандартного вызова функций numRowsAffected() или size(), но что поделать?