Microsoft SQL Server, Qt

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

Для получения количества обработанных записей запросом (insert, update, delete) в Qt используют функцию numRowsAffected(), а для получения размера выборки — size() объекта QSqlQuery:

QSqlQuery query;
if (!query.exec("delete from people where age < 20")) {
	qDebug() << "error:" << query.lastError()->text();
	return;
}
qDebug() << "rows count" << query.numRowsAffected();
numRowsAffected()
QSqlQuery query;
if (!query.exec("select * from people where age < 35")) {
	qDebug() << "error:" << query.lastError()->text();
	return;
}
qDebug() << "rows count" << query.size();
size()

Но не все СУБД поддерживают эту функцию. Например, SQLite и, о Боже! — Microsoft SQL Server (как не стыдно!). Проверить поддержку данной функции (а заодно и функции QSqlQuery::size()) можно так:

qDebug() << database.driver()->hasFeature(QSqlDriver::QuerySize);

где database — объект подключения к базе данных QSqlDatabase. Если в выводе приложения вы увидите false, то прогноз пессимистичен.

Что делать в этом случае?

Есть пара способов.

Первый  (для QSqlQuery::size()): позиционируемся на последней записи в наборе и получаем ее индекс +1:

int rowsCount = 0;
if (query.last()) 
	rowsCount = query.at() + 1;
qDebug() << "query size:" << rowsCount;

Чтобы вернуться в начало набора данных воспользуемся функциями first() и previous():

query.first();
query.previous(); 

Второй: делаем запрос к БД. Например, перед удалением сначала проверяем, сколько записей подпадают под критерии. В случае с вставкой и обновлением этот метод может оказаться ненадежным, т.к. в таблице могут оказаться старые записи, удовлетворяющие заданным критериям. Но можно сделать запрос перед операцией вставки или обновления и после операции. Зтаем сравнить результаты и сделать выводы о количестве обработанных записей.

Оба способа работают медленнее стандартного вызова функций numRowsAffected() или size(), но что поделать?

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

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