Для получения количества обработанных записей запросом (insert, update, delete) в Qt используют функцию numRowsAffected(), а для получения размера выборки — size() объекта QSqlQuery:
Но не все СУБД поддерживают эту функцию. Например, SQLite и, о Боже! — Microsoft SQL Server (как не стыдно!). Проверить поддержку данной функции (а заодно и функции QSqlQuery::size()) можно так:
где database — объект подключения к базе данных QSqlDatabase. Если в выводе приложения вы увидите false, то прогноз пессимистичен.
Что делать в этом случае?
Есть пара способов.
Первый (для QSqlQuery::size()): позиционируемся на последней записи в наборе и получаем ее индекс +1:
Чтобы вернуться в начало набора данных воспользуемся функциями first() и previous():
Второй: делаем запрос к БД. Например, перед удалением сначала проверяем, сколько записей подпадают под критерии. В случае с вставкой и обновлением этот метод может оказаться ненадежным, т.к. в таблице могут оказаться старые записи, удовлетворяющие заданным критериям. Но можно сделать запрос перед операцией вставки или обновления и после операции. Зтаем сравнить результаты и сделать выводы о количестве обработанных записей.
Оба способа работают медленнее стандартного вызова функций numRowsAffected() или size(), но что поделать?