Автор: fortero 26.4.2011, 19:46
И с нова я...
Подскажите пожалуйста как оптимально экономично используя ресурсы, и логически правельно узнать количество строк в запросе?
У меня есть такой вариант, но что то мне подсказует что он не целисообразно использует ресурсы!
if(!db.open()){
return 1;
}else{
//
QSqlQuery query;
query.exec("SELECT id,name,description FROM firm;");
QSqlRecord rec = query.record();
query.last();
int rrr = query.size();
query.first();
while(query.next()){
qDebug() << query.value(rec.indexOf("id")).toInt() << query.value(rec.indexOf("name")).toString();
}
qDebug() << "Rows: " << rrr;
return 0;
}
Буду очень признателен если кто-то прольёт свет, спасибо за внимание!
Автор: abc 26.4.2011, 19:52
int QSqlQuery::size () const
Автор: fortero 26.4.2011, 20:13
А это не оно?
int rrr = query.size();
Дело в том, что для того что бы вызвать выше указанную функцию итератору как я понимаю надо пролестать весь контейнер QSqlQuery, а это затраты на итерацию более проще можно получить сведенья?
Автор: abc 26.4.2011, 20:41
не понимаю тебя, ты написал в теме посчитать количество строк, query.size() даёт результат, при чём здесь обход элементов?
Автор: fortero 26.4.2011, 21:13
Цитата(abc @ 26.4.2011, 20:41)
не понимаю тебя, ты написал в теме посчитать количество строк, query.size() даёт результат, при чём здесь обход элементов?
Я в посте написал не как вообще решить эту проблему а как максимально правельно с точки зрения нагрузки, что бы максимально разумно использовать ресурсы!
Автор: abc 26.4.2011, 21:34
А почему ты сомневаешься, что это оптимально?
Автор: MoPDoBoPoT 26.4.2011, 22:07
Цитата(abc @ 26.4.2011, 22:34)
я думаю, при выборке из БД в какой-нибудь приватный член QSqlQuery пишется количество выбранных строк, после чего при запросе query.size() ты значение этого члена и извлекаешь, т.е. query.size() не считает строки
Это верно, если драйвер (и СУБД) поддерживает данную фичу.
Цитата(fortero @ 26.4.2011, 20:46)
Подскажите пожалуйста как оптимально экономично используя ресурсы, и логически правельно узнать количество строк в запросе?
Обычно пишется SQL-запрос вида:
SELECT COUNT(*) FROM my_table
Если возвращаемое число каким-то образом используется для изменении данных в БД, то запрос на количество записей и изменение данных делается в рамках одной транзакции, чтобы данные были консистентными.
Автор: fortero 26.4.2011, 22:15
Цитата(MoPDoBoPoT @ 26.4.2011, 22:07)
Цитата(abc @ 26.4.2011, 22:34)
я думаю, при выборке из БД в какой-нибудь приватный член QSqlQuery пишется количество выбранных строк, после чего при запросе query.size() ты значение этого члена и извлекаешь, т.е. query.size() не считает строки
Это верно, если драйвер (и СУБД) поддерживает данную фичу.
Цитата(fortero @ 26.4.2011, 20:46)
Подскажите пожалуйста как оптимально экономично используя ресурсы, и логически правельно узнать количество строк в запросе?
Обычно пишется SQL-запрос вида:
SELECT COUNT(*) FROM my_table
Если возвращаемое число каким-то образом используется для изменении данных в БД, то запрос на количество записей и изменение данных делается в рамках одной транзакции, чтобы данные были консистентными.
Про это я знаю:
SELECT COUNT(*) FROM my_table
Но как извлечь данные из такого запроса не смейтесь я только начинаю в Qt работать и мне пока многое не понятно...
И как сделать 2 запроса в рамках одной транзакции? Просто мне внчале надо получить данные о количестве строк для передачи в мою функцию, а лиш потом получать контейнер query...
Автор: silver47 27.4.2011, 4:47
Если БД не SQLite то query.numRowsAffected();
Автор: PAFOS 27.4.2011, 8:24
Цитата(fortero @ 26.4.2011, 23:15)
Просто мне внчале надо получить данные о количестве строк для передачи в мою функцию, а лиш потом получать контейнер query...
С точки зрения оптимальности я бы выполнил запрос данных, затем эти данные поместил в контейнер (например в QList) попутно обрабатывая данные. В итоге имеем
1. через QList::count() я могу получить кол-во записей, причем независимо от возможностей sql драйвера
2. данные уже преобразованы и готовы к дальнейшей обработке.
Все лучше чем делать два sql запроса)