Microsoft SQL Server, Qt

QSqlQuery::numRowsAffected(), QSqlQuery::size() и MS SQL Server

Для получения количества обработанных записей запросом (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(), но что поделать?

Оставьте своё мнение...

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.